sax解析器原理
sax解析可以对读取到的xml文件内容进行实时处理,涉及两个部分:解析器和事件处理器,创建解析器后用解析器指定要解析的文件,当读取到xml文件的一个部分时,例如开始、元素、元素内容后即触发了相应的事件,并由系统自动调用事件处理器中的对应方法,同时将读取的内容作为函数的参数传递给该函数。
首先建立一个xml文档
<?xml version="1.0" encoding="UTF-8" ?>
<bookshelf >
<book>
<name>One Day</name>
<sale>23.9元</sale>
<author>somebody</author>
</book>
<book>
<name>World</name>
<sale>10元</sale>
<author>someone</author>
</book>
</bookshelf>
现在开始用sax解析方式对该文档进行解析
第一步:获得解析器
SAXParser sp=SAXParserFactory.newInstance().newSAXParser();
第二步:得到读取器、
XMLReader xReader=sp.getXMLReader();
第三步:设置内容处理器,即实现ContentHandler接口的类
xReader.setContentHandler(new ListHandler());
第四步:读取xml内容
xReader.parse("src/book.xml");
第三步骤中需要将一个ContentHandler的对象作为参数传递给读取器,读取器在读取到内容时即调用该对象的相应函数对内容进行处理。在实际开发中通常是继续DefaultHandler类,该类实现了ContentHandler接口,我们只需覆盖我们关心的方法即可。
例:读取第二个标签为name的标签内容
package sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SaxParase2 {
public static void main(String [] args) throws Exception{
SAXParser sp=SAXParserFactory.newInstance().newSAXParser();
//get XMLReader
XMLReader xReader=sp.getXMLReader();
xReader.setContentHandler(new TagHandler());
//read the content
xReader.parse("src/book.xml");
}
}
class TagHandler extends DefaultHandler{
private String currentTag;
private int count=0;
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
currentTag=qName;
if(qName.equals("name")){
count++;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
//currentTag=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if((currentTag.equals("name")) && (count==2)){
System.out.println(new String(ch,start,length));
}
}
}