使用Xerces-J的SAX方式进行XML程序设计

--SAX2的基本使用方法


首先我们要创建一个从DefaultHandler类继承而来的类。如以下代码

import org.xml.sax.helpers.DefaultHandler; public class TestSAX2 extends DefaultHandler { public TestSAX2 () { super(); } }

但是上面的代码什么事情都不会做,我们还要继续重载DefaultHandler里面的方法,进行实际性的处理工作。

然后第二步是生成一个XmlReader类的实例。在进行这一步工作的时候我们需要一个XML文件的解析器。前面我们提到过SAX自己并没有提供真正的XML文件解析器,不要紧,Xerces为我们写了一个,名字叫做org.apache.xerces.parsers.SAXParser。读者很快就会学习到如何使用其他的组织或者软件提供商编写的解析器。下面的代码将可以新建一个解析器。

XmlReader oXReader = XMLReaderFactory.createXMLReader();

这里使用了XMLReaderFactory中的createXMLReader()方法。这个方法返回一个系统缺省的XML解析器。如果读者把org.apache.xerces.parsers.SAXParser设置为系统缺省解析器的话,调用这个方法将会返回org.apache.xerces.parsers.SAXParser。但是如上面说过的这种方法需要在命令行中指定实际的Parser。XMLReaderFactory还有一个createXMLReader方法,是用解析器的名字的字符串作为参数的。使用如下:

XmlReader oXReader = XMLReaderFactory. createXMLReader ( “org.apache.xerces.parsers.SAXParser”);

使用这种方法有一个小技巧就是将解析器的名字写在一个外部的配置文件中,些程序的时候先打开配置文件,读出解析器的名字,然后再用XMLReaderFactory创建XMLReader实例。

下面的例子演示了一个完整的处理过程。这个例子在Pwindows98,JDK1.2/1.3 的环境下调试通过。

import org.xml.sax.*; import org.xml.sax.helpers.*; import java.io.FileReader; public class TestSAX2 extends DefaultHandler { //我们在这里创建一个名为TestSAX2的类,这个类继承了DefaultHandler类。 public static void main( String [] x ) { try { //下面一行代码创建XMLReader XMLReader oXReader = XMLReaderFactory.createXMLReader(); //XMLReader oXReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); //上面这一行是使用SUN的JAXP接口的代码。 TestSAX2 test = new TestSAX2(); //上面一行创建一个TestSAX2的实例 oXReader.setFeature("http://xml.org/sax/features/namespaces",true); //上面一行打开了名空间功能。 oXReader.setContentHandler( test ); //上面一行设置内容处理器 oXReader.setDTDHandler(test); //上面一行设置DTD处理器 oXReader.setEntityResolver(test); //上面一行设置EntityResolver oXReader.parse( new InputSource( new FileReader( "test.xml") ) ); //上面一行进行解析。 } catch( Exception e )//错误处理 { e.printStackTrace(); } } //constructor public TestSAX2 () { super(); } //后面是重载的DefaultHandler类的处理方法。 public void endElement( String uri, String localName, String qName) { System.out.println("end of a Element ==> uri:"+uri+"; localName:"+localName+"; qName:"+qName); } public void startPrefixMapping(String prefix, String uri) { System.out.println("start of Prefix Mapping ==>prefix:"+prefix+"; uri:"+uri); } public void endPrefixMapping(String prefix) { System.out.println("end of PrefixMapping==>prefix:"+prefix ); } public void notationDecl(String name,String publicId,String systemId) { System.out.println("notationDecl==> name:"+name+"; publicID"+publicId+"; systemID:"+systemId); } }