这篇博文主要讨论XML解析中的SAX技术。
SAX解析概述:
SAX采用事件处理的方式解析XML文件,利用SAX 解析XML 文档,涉及两个部分:解析器和事件处理器:
1.通过JAXP的API创建出SAX解析器,然后通过解析器创建XMLReader,并给XMLReader设置事件处理器
2.在解析xml文档不同组成部分时,会回调事件处理器的相应的回调函数,并会把解析到的xml文件内容作为方法的参数传递给事件处理器。
3.事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据
图解如下:
相比DOM解析SAX具有如下特点:
1.相比DOM解析需要将整个xml文件加载到内存中,SAX解析是一边读文档,一边对文档进行处理,及回调相应的函数。
2.sax只能用于读取xml文件,无法进行更新操作
SAX常用事件如下:
startDocument() ----文档开始事件
startElement() ----元素开始事件
characters() ----文本元素事件
endElement() ----元素结束事件
endDocument() ----文档结束事件
图解如下:
下面展示SAX解析JUnit代码:
解析的xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<users>呵呵</users>
JUnit测试代码如下:
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 localName, String qName)
throws SAXException {
System.out.println("endElement :"+qName);
}
};
}