使用JAXP进行XSLT程序设计

--使用jaxp的dom方式解析xml文档


jaxp提供了DocumentBuilderFactory和DocumentBuilder这两个抽象类来进行dom方式的xml解析。DocumentBuilderFactory类提供了一个设置和获取一个与实现无关的DOM 解析器的方法。DocumentBuilderFactory是多线程不安全的,因此程序员在开发时要自己处理多线程程序(例如servlet和jsp)可能遇到的问题。 DocumentBuilderFactory类中定义的方法如下表。

方法名 使用说明
Object getAttribute(java.lang.String name) 通过调用这个方法可以获取具体实现的一些属性。
boolean isCoalescing() 看看是否把DocumentBuilderFactory的状态设置成生成一个能够把CDATA数据转换成text然后到合并相邻的Text的解析器。这里coalesce的意思是“接合”的意思。
boolean isExpandEntityReferences() 看看生成的解析器是否扩展EntityReference。
boolean isIgnoringComments() 看看生成的解析器是否忽略注释。
boolean isIgnoringElementContentWhitespace() 看看生成的解析器是否忽略无用的空白。
boolean isNamespaceAware() 看看生成的解析器是否支持名空间。
boolean isValidating() 看看生成的解析器是否校验。
DocumentBuilder newDocumentBuilder() 根据当前的设置生成一个DocumentBuilder,DocumentBuilder是jaxp中的dom解析器。
DocumentBuilderFactory newInstance()

这个静态方法返回一个DocumentBuilderFactory的实例。生成的具体实例遵循以下规则。

  1. 首先,看看是否在启动java虚拟机的时候用-D定义了javax.xml.parsers.DocumentBuilderFactory属性。如果没有,继续。
  2. 其次,看看在jre目录下的lib/jaxp.properties文件是否存在,如果存在,就从中读取上面的定义。如果没有,继续。
  3. 通过Service API看看安装的jar包中是否有META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件,如果有,就从其中获取定义。一般情况下到此为止了。如果没有,继续。
  4. 使用缺省的DocumentBuilderFactory定义。一般情况下是在crimson.jar包中定义的org.apache.crimson.jaxp.DocumentBuilderFactoryImpl类。
void setAttribute(java.lang.String name, java.lang.Object value) 设置一个同具体实现相关的属性。
void setCoalescing(boolean coalescing) 设置是否进行CDATA转换和合并。缺省情况下是false。
void setExpandEntityReferences(boolean expandEntityRef) 设置是否展开实体引用,缺省情况下是true。
void setIgnoringComments(boolean ignoreComments) 设置是否忽略注释,缺省情况下是false。
void setIgnoringElementContentWhitespace(boolean whitespace) 设置是否忽略可忽略的空白节点,缺省情况下是false。这个功能需要进行校验(validate)。
void setNamespaceAware(boolean awareness) 设置是否支持名空间,缺省为false。
void setValidating(boolean validating) 设置是否校验,缺省为false。

DocumentBuilder类定义了一系列的方法接口,通过这些接口,我们可以从一个XML文档或者相应的输入源或者凭空获得一个Document界面的实现对象,换句话说就是可以获得一个文档树。 DocumentBuilder对象可以通过DocumentBuilderFactory类的newDocumentBuilder方法获得。DocumentBuilder不保证在多线程共享一个DocumentBuilder对象时不会出问题,所以,最好不要多个线程共享一个DocumentBuilder对象。DocumentBuilder类中定义的方法如下表。

方法名 使用说明
DOMImplementation getDOMImplementation() 获取一个DOMImplementation的实例。DOMImplementation界面的实例可以进行与文档无关的dom操作。
boolean isNamespaceAware() 看看是否支持名空间。
boolean isValidating() 看看是否校验。
Document newDocument() 凭空创建一个新的Document对象。
Document parse(java.io.File f) 从一个文件创建一个Document对象。
Document parse(InputSource is) 从一个InputSource创建一个Document对象。
Document parse(java.io.InputStream is) 从一个输入流创建一个Document对象。
Document parse(java.io.InputStream is, java.lang.String systemId) 从一个输入流创建一个Document对象。并且提供一个解析uri的目录。
Document parse(java.lang.String uri) 从一个uri创建一个Document对象。
void setEntityResolver(EntityResolver er)  
void setErrorHandler(ErrorHandler eh)  

下面的代码演示了如何使用DocumentBuilder和DocumentBuilderFactory来进行解析。

Document oDoc = null; try { DocumentBuilderFactory oDocBuilderFac = DocumentBuilderFactory.newInstance(); DocumentBuilder oDocBuilder = oDocBuilderFac.newDocumentBuilder(); oDoc = oDocBuilder.parse("test.xml"); } catch(.....) { }

最后我们用一个完整的例子来演示如何使用jaxp进行dom方式的xml程序设计。这个例子还是我们前面曾经演示过的留言板程序,但是使用jaxp代替了xerces作为xml解析器。