这篇博文主要讨论XML解析中的SAX技术。
SAX解析概述:
SAX采用事件处理的方式解析XML文件,利用SAX 解析XML 文档,涉及两个部分:解析器和事件处理器:
1.通过JAXP的API创建出SAX解析器,然后通过解析器创建XMLReader,并给XMLReader设置事件处理器
2.在解析xml文档不同组成部分时,会回调事件处理器的相应的回调函数,并会把解析到的xml文件内容作为方法的参数传递给事件处理器。
3.事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据
图解如下:
相比DOM解析SAX具有如下特点:
2.sax只能用于读取xml文件,无法进行更新操作
SAX常用事件如下:
startDocument() ----文档开始事件
startElement() ----元素开始事件
characters() ----文本元素事件
endElement() ----元素结束事件
endDocument() ----文档结束事件
图解如下:
下面展示SAX解析JUnit代码:
解析的xml文件如下:
package neuq.test.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class SAXTest { @Test public void testParseXMLBySAX() throws ParserConfigurationException,SAXException,IOException{ //使用SAXParserFactory创建SAX解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //通过SAX解析工厂得到解析器对象 SAXParser parser=factory.newSAXParser(); //通过解析器对象得到一个XML读取器 XMLReader reader=parser.getXMLReader(); //设置读取器的事件处理器,直接创建ContentHandler的实现类DefaultHandler即可 reader.setContentHandler(MyHandler); //解析xml文件 reader.parse("src/neuq/test/sax/users.xml"); } private ContentHandler MyHandler=new DefaultHandler(){ public void startDocument() throws SAXException { System.out.println("startDocument "); } public void endDocument() throws SAXException { System.out.println("endDocument "); } public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException { System.out.println("startElement :"+qName+"---"+"AtrributeValue : "+attributes.getValue(1)); } public void characters(char[] ch,int start,int length) throws SAXException { System.out.println("characters : "+new String(ch,start,length)); } public void endElement(String uri,String qName) throws SAXException { System.out.println("endElement :"+qName); } }; }