一、SAX简介:
基于DOM的解析器的核心是在内存中建立和xml文档对应的树性树状结构,xml文件的标记、标记中的文本数据、实体等都会和内存中树状结构的某个节点相对应。使用DOM解析器的好处是,可以方便地操作内存中的树的节点来处理XML文档,获取自己所需要的数据。但是DOM解析器的缺点是,如果XML文件比较大,或者只需解析某个XML文档的一小部分时我们都必须将整个xml文件加载到内存,这样就浪费了很多服务器的内存空间。
SAX很好的解决了上面提到的DOM在空间资源浪费方面的不足,SAX解析器不在内存中建立和XML文档相对应的树状结构数据,SAX解析器的核心是:事件处理机制,具有占用内存少、效率高等特点。
二、实例:使用SAX操作XML文件,并将XML问价原样输出到控制台
package com.xml.demo;
import java.io.IOException;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* SAX解析器的核心是事件处理机制,具有占有内存少、效率高等特点。
*
* @author towards future
* */
public class MyReadXMLBySAX extends DefaultHandler {
public void parserXMLFile(String fileName) throws IOException {
try {
// 创建解析器对象
XMLReader reader = XMLReaderFactory.createXMLReader();
// 注册内容处理器
reader.setContentHandler(this);
// 注册错误处理器
reader.setErrorHandler(this);
// 分析文档
reader.parse(fileName);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
/**
* 元素结束事件
* */
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 输出输出流中的信息,并刷新缓存
System.out.println("</" + qName + ">");
}
@Override
/**
* 文档开始事件
* */
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
}
@Override
/**
* 元素开始事件
* */
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws SAXException {
// 将信息追加到输出流尾
System.out.append("<" + qName);
for (int i = 0; i < attributes.getLength(); i++) {
String attrName = attributes.getQName(i);
String attrValue = attributes.getValue(i);
System.out.append("" + attrName + "=" + attrValue);
}
System.out.append(">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
// 追加text节点信息
System.out.append(new String(ch, start, length));
}
public static void main(String[] args) throws IOException {
MyReadXMLBySAX parser=new MyReadXMLBySAX();
parser.parserXMLFile("WebRoot\\book.xml");
}
}
三、运行
注意:在运行前先要创建一个book.xml文件
结果:
<?xml version="1.0" encoding="UTF-8"?>
<book>
<info>
测试1
<name>111</name>
<author>孙兴</author>
</info>
<info>
测试2
<name>javaweb开发</name>
<author>雷宏</author>
</info>
</book>