(1)得到SAX解析器的工厂实例
SAXParserFactory saxfac=SAXParserFactory.newInstance();
这是一个javax.xml.parsers.SAXParserFactory类的实例
(2)从SAX工厂实例中获得SAX解析器
SAXParser saxparser=saxfac.newSAXParser();
使用javax.xml.parsers.SAXParserFactory工厂的newSAXParser()方法
(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它
InputStream is=new FileInputStream("bin/library.xml");
InputStream是一个接口。
(4)解析XML文档
saxparser.parse(is,new MySAXHandler());
首先新建一个解析工厂------>解析工厂产生一个解析器------->解析器根据-------->解析处理器+输入流-------->解析文档
为什么不直接把输入流放进解析器里处理不要解析处理器呢?原因很简单,如果直接写在解析器里面,只能实现某种特定的解析?当使用解析处理器时可以通过传入不同的解析处理器,来实现不同的功能。
示意图如下:
我们新建了一个实例new MySAXHandler()这个实例里面又有什么东西呢?
这个实例就是SAX的精华所在。我们使用SAX解析器时,必须实现内容处理器ContentHandler接口中的一些回调方法,然而我们不须要全部地实现这些方法,还好,我们有org.xml.sax.helpers.DefaultHandler类,看它的类申明:
不要看它一大堆,我一一分解给大家看。我们说SAX是基于事件的API,我们这个类实到了ContentHandler接口中的如下方法:
(1)startDocument() 用于处理文档解析开始事件
public void startDocument() throws SAXException {
System.out.println("文档开始打印了");
}
(2)endDocument() 用于处理文档解析结束事件
public void endDocument() throws SAXException {
System.out.println("文档打印结束了");
}
(3)startElement 用于处理元素开始事件
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if(qName.equals("books")){
return;
}
if(qName.equals("book")){
System.out.println(attributes.getQName(0)+attributes.getValue(0));
}
if(attributes.getLength()>0){
this.attributes=attributes;
this.hasAttribute=true;
}
}
第二个参数String qName表示这个元素的名字,如:
根节点 <books></books> 它的