10.3.2 SAX解析方式
步骤:
1、新建一个类,继承自DefaultHandler类,并复写其五个方法:
public class ContentHandler extendsDefaultHandler{
@Override//该方法会在开始XML解析的时候调用
public void startDocument() throwsSAXException {}
@Override //该方法会在开始解析某个结点的时候调用
public void startElement(String uri, StringlocalName, String qName, Attributes attributes) thows SAXEception{}
@Override//该方法会在获取结点内容的时候调用
public void characters(char[] ch, intstart, int length)throws SAXException{}
@Override//该方法会在完成解析某个结点的时候调用
public void endElement(String uri, StringlocalName,String qName)throws SAXException{}
@Override//该方法会在完成整个XML解析的时候调用
public void endDocument()throws SAXException{}
}
注意:中间三个方法是有参数的。
在获取结点内容时,characters()方法可能会被调用多次,一些换行符也被当作内容解析出来,我们需要针对这种情况在代码中做好控制。
2、给id,name,version结点分别定义了一个StringBuilder对象,并在startDocument()方法里对它们进行了初始化。
privateString nodeName;
privateStringBuilder id;
privateStringBuilder name;
privateStringBuilder version;
@Override
public voidstartDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
3、每当开始解析某个结点的时候,startElement()方法就会得到调用,其中localName参数记录着当前结点的名字,这里我们把它记录下来。
@Override
public voidstartElement(String uri, String localName, String qName,Attributes attributes)throws SAXException{
//记录当前结点名
nodeName = localName;
}
4、接着在解析结点中具体内容的时候就会调用characters()方法,在这个方法中,我们会根据当前的结点名进行判断,将解析出的内容添加到哪一个StringBuilder对象中。
@Override
public voidcharacters(char[] ch, int start, int length) throws SAXException {
//根据当前的结点名判断将内容添加到哪一个StringBuilder对象中
if(“id”.equals(nodeNme)){
id.append(ch,start,length);
} else if ( “name”.equals(nodeName)){
name.append(ch,start,length)
} else if (“version”.equals(nodeName)){
version.append(ch,start,length)
}
}
5、最后在endElement()方法中进行判断,如果app结点已经解析完成,就打印出id,name,version的内容。
@Override
public voidendElement(String uri,String localName,String qName) throws SAXException{
if(“app”.equals(localName)){
Log.d(“ContentHandler”, “id is “ +id.toString.trim());
Log.d(“ContentHandler”, “name is “ +name.toString.trim());
Log.d(“ContentHandler”, “version is “ +version.toString.trim());
//最后要将StringBuilder清空掉
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
6、在MainActivity中得到了服务器返回的数据之后,调用我们自己创建的专门用SAX方式解析XML数据的方法。在这个方法当中进行着如下操作:
(1)创建一个SAXParserFactory的对象;
(2)然后利用该对象调用其newSAXParser()方法,得到SAXParser对象,然后再利用该对象调用其getXMLReader()方法,得到XMLReader对象。
(3)接着将我们刚编写的ContentHandler的实例设置到XMLReader中。
(4)最后调用parse()方法开始执行解析即可。
private voidparseXMLWithSAX(String xmlData){
SAXParserFactory factory =SAXParserFactory.new Instance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = newContentHandler();
//将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(newStringReader(xmlData)));
}