XML解析之——SAX解析

一、定义

SAX,全称 Simple API for XML,是一种以事件驱动的XML API 由于它是边扫描边解析,所以具有解析速度快、占用内存小的有点。

二、解析步骤

1、获取XML文件资源,可以是XML文件的输入流或者文件、uri。

2、得到SAX解析器工厂(SAXParserFactory)。

SAXParserFactory factory= SAXParserFactory.newInstance();

3、通过SAX解析器工厂获取SAX解析器(SAXParser)。

SAXParser parser=factory.newSAXParser();

4、重写SAXParser解析所需要的DefaultHandler类,在此类中进行具体的XML文件解析操作。

5、最后调用SAXParser的parse()方法,开始解析。

parser.parser(inputStream,myDefaultHandler);

三、DefaultHanler的五个方法

SAXParser解析器在调用parse()方法时,需要提供两个参数,第一个是XML文件资源,可以是输入流(InputStream)、文件(File)、uri(String)。第二个是一个需要继承DefaultHandler的对象实例。通常需要重写这个类的五个方法以达到解析XML的目的。

1、public void startDocument() 

解析开始时调用此方法,一般在此方法中创建一个XML元素的List集合。

2、 public void startElement(String uri, String localName, String qName, Attributes attributes)

当parser解析到一个开始标签时,调用此方法,在此方法中进行标签名称的判断。

namespaceURI——命名空间

localName——标签名称

fullName——带命名空间的标签名

Attributes——存放该标签的所有属性

3、 public void characters(char[] ch, int start, int length) 

在此方法中进行标签内容的获取。char[]数组存放了对应标签的值。

4、 public void endElement(String uri, String localName, String qName)

在此方法中判断结束标签名称是否为整个XML元素的结束标签,如果是则把此元素添加到之前创建的list集合中。

5、 public void endDocument()

四、应用实例

1、创建一个SaxParse类,进行SAX解析操作。

package com.example.pc.xmlparsetest;

import android.widget.TextView;

import org.w3c.dom.Text;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/**
 * Created by pc on 2018/6/3.
 */

public class SaxParse {

    private SAXParserFactory factory;
    private InputStream is;
    private List<Movie> movies=new ArrayList<Movie>();
    private TextView showMovies;

    public SaxParse(SAXParserFactory factory,InputStream is,TextView showMovies) {
        this.factory = factory;
        this.is=is;
        this.showMovies=showMovies;
    }


    public void parse() throws ParserConfigurationException, SAXException, IOException {
        //通过SAXParser解析工厂获取SAXParser实例
        SAXParser parser=factory.newSAXParser();
        //创建重写的MyDfaultHandler类
        MyDefaultHandler handler=new MyDefaultHandler();
        //开始解析
        parser.parse(is,handler);
        //获取解析得到的list集合
        movies=handler.getResult();
        showMovies.setText(movies.toString());
        is.close();

    }
}

2、创建重写的DefaultHandler类。

package com.example.pc.xmlparsetest;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by pc on 2018/6/3.
 */

public class MyDefaultHandler extends DefaultHandler {
    private List<Movie> movies;
    private String elementTag;
    private Movie m;


    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        //创建存储所有Movie元素的的集合
        movies=new ArrayList<Movie>();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
       //如果开始标签名称为movie则创建一个Movie对象
       if("movie".equals(qName)){

          m=new Movie();


       }
       //将标签名称存储
        elementTag=qName;
        super.startElement(uri, localName, qName, attributes);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
         //获得对应标签的内容
        String content=new String(ch,start,length);
        //判断标签名称,并将对应值存入之前创建的Movie对象中
        if("name".equals(elementTag)){
             m.setName(content);
        }else if("director".equals(elementTag)){
            m.setDirector(content);
        }else if("country".equals(elementTag)){
            m.setCountry(content);
        }

        super.characters(ch, start, length);

    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {

        elementTag="";
        //如果结束标签时movie则将创建的Movie对象添加到集合中
        if(qName.equals("movie")){

            movies.add(m);
        }
        super.endElement(uri, localName, qName);

    }

    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
    //返回结果list集合
    public List<Movie> getResult(){

        return movies;

    }
}

3、在Activity中创建SaxParser对象,并调用他的parse类进行解析。

                  //创建存储在Assets文件夹中的XML输入流
                  AssetManager am2=getAssets();
                  try {
                      is2=am2.open("movies.xml");

                  } catch (IOException e) {
                      e.printStackTrace();
                  }
                  //创建解析类,并传入参数
                  SaxParse sp=new SaxParse(factory,is2,showMovies);
                  try {
                      //开始解析
                      sp.parse();
                  } catch (ParserConfigurationException e) {
                      e.printStackTrace();
                  } catch (SAXException e) {
                      e.printStackTrace();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }

4、运行结果




猜你喜欢

转载自blog.csdn.net/mahuicool/article/details/80561423