一、定义
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、运行结果