- DOM解析的优点是读取小型文件速度快,可以对xml文件数据进行修改,但是DOM解析最大的缺点就是占用内存高,每次需要将DOM树加载到内存中.
- 为了解决DOM解析的缺点,可以使用SAX解析技术来对xml文档进行解析.
- SAX解析(Simple API for XML),并不是w3c官方的标准.SAX解析与DOM解析不同的是,SAX解析采用的是将逐行顺序解析,按照文件的顺序,读一行解析一行的方式解析xml文件,因此相对来说比较快捷,也可以读取大型xml文件,但是SAX不能够只能够进行xml文件的读取,不能够进行增删改操作.
SAX解析的初步实现
|
|
javax.xml.parsers.SAXParserFactory |
SAX分析器工程类,主要作用于实例化SAXParser类对象 |
javax.xml.parsers.SAXParser |
SAX解析器,主要用于解析xml文件 |
org.xml.sax.helpers.DefaultHandler |
处理不同触发事件的操作 |
触发事件
- SAX解析器在解析xml文件的时候,会将每次触发的事件交给程序,例如,在解析到xml文档的时候,就有文档开始触发,读取到xml文件中一个开始元素时,就会有元素开始触发,有些事件只会触发一次,有些事件会触发多次.
- 程序员或用户可以定义一个专门处理这些事件的程序类,这个类必须继承DefaultHandler这个类,并根据需要覆写对应的方法.
- DefaultHandler类中的常用方法
|
|
元素开始触发 |
public void startDocument() throws SAXException |
文档结束触发 |
public void endDocument() throws SAXException |
元素开始触发 |
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException |
元素结束触发 |
public void endElement(String uri, String localName,String qName)throws SAXException |
读取文字信息 |
public void characters(char[] ch, int start, int length)throws SAXException |
定义解析器
package mao.shu.test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.lang.reflect.Array;
import java.util.Arrays;
public class TestSAXParser extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
System.out.println("SAX解析器开始解析xml文件");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("开始读取元素 xml文件 = "+uri+" , 标签名称 = "+localName+" , qName = "+qName+"属性 = "+attributes);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("读取元素结束 xml文件 = "+uri+" , 标签名称 = "+localName+" , qName = "+ qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
}
@Override
public void endDocument() throws SAXException {
System.out.println("文档读取结束");
}
}
- 创建TestParser类,解析info.xml文件
<?xml version="1.0" encoding="utf-8" standalone="no"?><shop>
<pen>
<type>钢笔</type>
<manufacturers id="9567">长城牌</manufacturers>
<tradePrice>0.5</tradePrice>
</pen>
<book>
<name>新的世界,新的你</name>
<year>3</year>
<price>56.6</price>
</book>
<book>
<name>java入门到跑路</name>
<year>111</year>
<price>100</price>
</book>
</shop>
package mao.shu.test;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
public class TestParser extends DefaultHandler {
public static void main(String[] args) throws Exception{
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
File xmlFIle = new File("e:"+File.separator+"testWeb"+File.separator+"info.xml");
saxParser.parse(xmlFIle,new TestSAXParser());
}
}
- 从解析过程中可以发现,SAX进行解析的时候,是一行一行按照顺序进行解析的,所以适合读取大型的xml文件.