JAXP 全部内容,第 2 部分:使用 Sun 的 XML 处理工具包来转换 XML
2010-04-06 00:00:00 来源:WEB开发网清单 6 中的黑体行表示需要从 清单 5 进行的惟一更改。不是使用工厂来直接获得 Transformer,而是使用 newTemplates() 方法;这将返回一个 Templates 对象,它是线程安全的。可以将该对象传递到其他线程中的其他方法,而且根本无需担心。因为它将从传递它的 XSL 中预编译转换指令,所以传递给其他方法甚至线程是安全的。
然后,从 Templates.newTransformer() 方法中获得 Transformer 实例。在这个阶段无需指定 XSL,因为 Transformer 已经处理过了(事实上,它是已编译的 XSL,所以可以不更改样式表,如果您愿意的话)。除了多出的一行以及对现有行的一个更改之外,再无其他新内容。相当酷,考虑一下您的代码因为这个小小的更改变得有多好。
从 Transformer 到 Templates
最后一个值得考虑的问题是,何时使用从工厂直接获得的 Transformer 和何时使用 Templates 对象。我几乎总是选择使用 Templates 对象,因为使用 XSL 时,我总是重复使用相同的样式表。与其花时间在 XSL 上进行多次传递,我宁愿将指令预编译到 Templates 对象中,完成 XSL 处理。
也就是说,在一些情况下,最好是直接从 TransformerFactory 中拖出 Transformer。如果您知道您将只使用特定样式表执行单个转换,那么不预编译到 Templates 对象中会比较快,因为预编译需要略多一点的开销。但是,需要确保没有重用。在我的(完全不科学,使用了简短的样例)测试中,我发现如果使用一个 XSL 样式表两次,使用 Templates 对象和直接使用 Transformer 不分上下。 一旦使用三次以上,Templates 方法就要好多了。您还需要确保将没有任何线程技术问题;但这是一件简单的事情,所以我把它留给您应用在编程中。 一般地,使用 Templates 对象通常更安全。
更改 XSL 处理器
在 第 1 部分 中已经看到,通过更改系统属性,可以用自己的实现替换默认 JAXP 解析器实现。同一原则适用于 XSL 处理器。JAXP 预包装有 Xalan-J,我总是使用它。但灵活性总是好事,而 JAXP 提供了这一点。
如果想要使用除 Xalan 之外的处理器,请为名为 javax.xml.transform.TransformerFactory 的系统属性提供一个值。需要为该属性分配要实例化的类的名称。该类应继承 javax.xml.transform.TransformerFactory(当然,这也是要设置的系统属性的名称),并填充方法其余的抽象。仅使用如下代码:
java -Djavax.xml.transform.TransformerFactory=[transformer.impl.class] TestTransformations
simple.xml simple.xsl
全部结束!
结束语
在早期版本中,JAXP 不过是位于 SAX 和 DOM 以及那些 API 过时版本之上的小薄层。现在,使用 JAXP 1.3 可以解析、验证并转换 XML,而无需编写一行特定于开发商的代码。虽然追溯到 SAX 代码、使用类似 DTDParser的工具或甚至自己处理转换,这些都是有意义的,但在 API 和工具的仓库中您需要 JAXP。甚至可能比开发商中立性更重要的一点是,具有最新的 Java 虚拟机 (JVM) 的所有客户和客户机都将具有 JAXP。所以使用它,好好使用它,经常使用它。
本文示例源代码或素材下载
更多精彩
赞助商链接