使用JAXP进行XSLT程序设计

--使用jaxp1.1的SAX方式解析xml文档


jaxp提供了SAXParserFactory和SAXParser这两个抽象类来进行基于SAX的XML解析工作。SAXParserFactory是使用jaxp的SAX方式进行xml文件解析的起点,SAXParserFactory可以用来设置和获取一个SAXParser。SAXParserFactory不是多线程安全的,所以在开发时程序员要自己解决多线程问题。SAXParserFactory中的方法如下表。

方法名 使用说明
boolean getFeature(java.lang.String name) 获取一个Feature。
boolean isNamespaceAware() 看看解析器是否支持名空间。
boolean isValidating() 看看解析器是否校验。
static SAXParserFactory newInstance() 静态方法,调用这个方法可以获取一个新的SAXParserFactory的实例。
SAXParser newSAXParser() 根据现有的设置,例如是否支持名空间,是否校验,创建一个新的SAXParser。
void setFeature(java.lang.String name, boolean value) 设定一个Feature。
void setNamespaceAware(boolean awareness) 设定是否支持名空间。
void setValidating(boolean validating) 设定是否支持校验。

在通过SAXParserFactory获取了一个SAXParser之后,我们就可以进行实际的处理工作了。如果您对SAX方式不是很熟悉,请访问我在介绍apache/ibm开发的Xerces解析器时写的关于SAX的介绍性文章。JAXP的SAXParser隐含了一个SAX2中的XMLReader。因此如果您熟悉XMLReader的使用的话,掌握SAXParser的使用简直就是小菜一碟。

在抽象类SAXParser中定义的方法如下表。

方法名 使用说明
Parser getParser() 这是一个SAX1的方法,返回一个SAX1的parser。
Object getProperty(java.lang.String name) 获取一个property,和XMLReader中的一样。
XMLReader getXMLReader() 获取和这个SAXParser相关的XMLReader。
boolean isNamespaceAware() 看看是否支持名空间。
boolean isValidating() 看看是否校验。
parse(java.io.File f, DefaultHandler dh) 通过一个File和一个DefualtHandler进行SAX解析。
parse(java.io.File f, HandlerBase hb) SAX1方法。功能同上。
parse(InputSource is, DefaultHandler dh) 通过一个InputSource和一个DefaultHandler进行SAX解析。
parse(InputSource is, HandlerBase dh) SAX1方法,功能同上。
void parse(java.io.InputStream is, DefaultHandler dh) 通过一个Stream和一个DefaultHandler进行SAX解析。
void parse(java.io.InputStream is, DefaultHandler dh, java.lang.String systemId) 通过一个Stream和一个DefaultHandler进行SAX解析。并且给这个流一个System ID。
void parse(java.io.InputStream is, HandlerBase hb) SAX1方法。通过一个Stream和一个HandlerBase进行SAX解析。
void parse(java.io.InputStream is, HandlerBase hb, java.lang.String systemId) SAX1方法。通过一个Stream和一个HandlerBase进行SAX解析。并且给这个流一个System ID。
void parse(java.lang.String uri, DefaultHandler dh) 通过一个uri和一个DefaultHandler进行SAX解析。
void parse(java.lang.String uri, HandlerBase hb) SAX1方法,功能同上。
abstract void setProperty(java.lang.String name, java.lang.Object value) 设置一个property。同XMLReader中的同名方法。

下面的代码演示了如何使用JAXP的SAXParser。

class A extends DefaultHandler { ......... } pulic class B { public static void main(String[] arg) { try { SAXParserFactory oSAXParserFac = SAXParserFactory.newInstance(); SAXParser oParser = oSAXParserFac.newSAXParser(); oParser.parse(new File("test.xml"), new A() ); } catch(.......) { } } }

不过本人更倾向使用下面的方式。

class A extends DefaultHandler { ......... } pulic class B { public static void main(String[] arg) { try { SAXParserFactory oSAXParserFac = SAXParserFactory.newInstance(); SAXParser oParser = oSAXParserFac.newSAXParser(); XMLReader oReader = oParser.getXMLReader(); oReader.setContentHandler(new A); } catch(.......) { } } }