SAX(Simple APIs for XML,操作XML的简单接口),与DOM操作不同的是,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。当使用SAX解析器进行操作的时候会触发一系列的事件,如下表所示,当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,并由这些操作方法作出相应的操作,直至整个文档扫描结束。
如果想要实现这种SAX解析,则肯定要首先建立一个SAX的解析器,一个类只要继承了DefaultHandler类即可实现。
一个简单的XML解析器的代码如下所示:
package org.skewrain.xml.sax;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class MySAX extends DefaultHandler{
public void startDocument()
throws SAXException{
System.out.println("<?xml version=\"1.0\" encoding=\"GBK\">");
}
public void startElement(String uri,
String localName,
String qName;
Attributes attributes)
throws SAXException{
System.out.print("<");
System.out.print(qName);
System.out.print(">");
}
public void endElement(String uri,
String localName;
String qName)
throws SAXException{
System.out.print("<");
System.out.print("<");
System.out.print(qName);
System.out.print(">");
}
public void characters(char[] ch,
int start,
int length)
throws SAXException{
System.out.print(new String(ch,start,length));
}
public void endDocument()
throws SAXException{
System.out.println("文档结束。。。");
}
}
使用该解析器解析sax_01.xml。
Sax_01.xml的代码如下所示:
<?xml version="1.0" encoding="GBK" standalone="no"?>
<addresslist>
<linkman id="skewrain">
<name>斜雨</name>
<email>skewrain@foxmail.com</email>
</linkman>
<linkman id="northwind">
<name>skewrain</name>
<email>skewrain@foxmail.com</email>
</linkman>
</addresslist>
使用程序TestSAX.java引用该解析器解析sax_01.xml的代码如下所示:
package org.skewrain.xml.sax;
import java.io.*;
import javax.xml.parsers.*;
public class TestSAX {
public static void main(String args[]) throws Exception {
//建立SAX解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("d:" + File.separator + "sax_01.xml",new MySAX());
}
}
执行该段程序的结果如下所示:
在MySAX.java中加入如下属性解析的语句:
public void startElement(String uri,
String localName,
String qName,
Attributes attributes)
throws SAXException{
System.out.print("<");
System.out.print(qName);
if(attributes != null){
for(int x=0;x<attributes.getLength();x++){
System.out.print(" " + attributes.getQName(x) + "=\"" + attributes.getValue(x) + "\"");
}
}
System.out.print(">");
}
再次编译执行的结果如下所示:
SAX解析与DOM解析的区别:
SAX解析适合于文件的读取,但是不适合于文件的修改。DOM解析适合于文件的修改,不适合于文件的读取,二者各有优点,不能互相取代。