* SAX API是基于事件的。实现了 SAX API 的 XML 解析器跟据解析到的 XML 文档的不同特征产生事件。通过在 Java 代码中捕捉这些事件,就可以写出由 XML 数据驱动的程序。
解析过程中需要XML解析器,Apache Xerces就是其中的一种,可以从http://xml.apache.org/dist/xerces-j/ 下 载需要的解析器代码,解压缩程序后,将生成的xercesSamples.jar, xercesImpl.jar, xml-apis.jar,xmlParserAPIs.jar加入到系统的classpath中(或者xerces.jar,在1.4.4版本中,该 jar文件相当于上述jar的集合)。
并且指定解析程序需要的编译器,有两种方式指定:
1)在主程序中,进行解析前,即 XMLReader xr = XMLReaderFactory.createXMLReader(); 添加如下代码:
System.setProperty("org.xml.sax.driver","org.apache.xerces.parsers.SAXParser");
2)使用下面的命令,进行编译执行:
java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser Example2,Example2为主程序名称;
使用SAX API 的主要任务就是创建一个实现 ContentHandler 接口,一个供 XML 解析器调用以将分析 XML 文档时所发生的 SAX 事件分发给处理程序的回调接口。SAX API 也提供了一个已经实现了 ContentHandler 接口的 DefaultHandler 适配器类。
在DefaultHandler中,提供了如下的方法进行重载:
startDocument, endDocument, startElement, endElement, characters,这几种方法;
对于如下的xml文档:
<?xml version="1.0"?>
<simple date="7/7/2000" >
<name> Bob </name>
<location> New York </location>
</simple>
进行解析的顺序如下:
Example1 SAX Events:
SAX Event: START DOCUMENT
SAX Event: START ELEMENT[ simple ]
ATTRIBUTE: date VALUE: 7/7/2000
SAX Event: CHARACTERS[ ]
SAX Event: START ELEMENT[ name ]
SAX Event: CHARACTERS[ Bob ]
SAX Event: END ELEMENT[ name ]
SAX Event: CHARACTERS[ ]
SAX Event: START ELEMENT[ location ]
SAX Event: CHARACTERS[ New York ]
SAX Event: END ELEMENT[ location ]
SAX Event: CHARACTERS[ ]
SAX Event: END ELEMENT[ simple ]
SAX Event: END DOCUMENT
即在解析的过程中,会调用我们extends DefaultHandler的方法,例如解析开始,先动用startDocument方法,然后遇到<simple>后,调用startElement等。在调用的过程中,将中间解析到的结果存放在中间变量中:
例如:
public void startElement( String namespaceURI, String localName, String n ame, Attributes attr ) throws SAXException {
System.out.println( "SAX Event: START ELEMENT[ " +
localName + " ]" );
//Also, let's print the attributes if
// there are any...
for ( int i = 0; i < attr.getLength(); i++ ){
System.out.println( " ATTRIBUTE: " +
attr.getLocalName(i) + " VALUE: " + attr.getValue(i) );
}
解析程序,将中间结果存放在namespaceURL,localName,name,以及Attributes attr中,用户扩展的程序中,可以将这些结果读取出来,判断是否是自己需要的,如果是那么进行处理。
因此SAX,是数据驱动的。
这是SAX的最基本的原来,还有些问题需要处理:例如,在xml中,不同位置的element元素名称相同,在SAX API中,如何处理呢,可以使用Stack将不同元素的路径保存在堆栈中,使用元素的路径名来判别不同位置的元素。或者其他的问题;