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文件.