JAXP 全部内容,第 2 部分:使用 Sun 的 XML 处理工具包来转换 XML
2010-04-06 00:00:00 来源:WEB开发网调用该方法之后,转换的结果写出到所提供的 Result 中。在 清单 5 中,这是一个文件,但还可以将输出发送到 SAX ContentHandler 或 DOM Node 中。如果想要全部尝试,绑定的文件提供了简单的 XML 文件、XSL 样式表和源代码。
高速缓存 XSL 样式表
这一切都很简单,但这样使用 JAXP 有两个明显的限制:
每次执行 transform(),Transformer 对象都要处理 XSL 样式表。
Transformer 的实例不是线程安全的。在多个线程之间不能使用相同的实例。
这两个限制源自同一问题:Transformer 每次执行转换时,都必须重新处理 XSL。如果该处理出现在多个线程中,就可能发生严重问题。在线程问题之上,必须一再地付出处理 XSL 样式表的成本。毫无疑问,您非常希望知道如何解决这些问题,那就继续读下去。
加载模板
尚未讨论过的接口 javax.xml.transform.Templates 与 javax.xml.transform.Transformer 相近。Templates 接口是线程安全的(解决了第二个限制),并代表已编译的样式表(解决第一个限制)。在讨论相关概念之前,请查看清单 6:
清单 6. 使用 JAXP Templates 接口
try {
// Set up input documents
Source inputXML = new StreamSource(
new File("phonebook.xml"));
Source inputXSL = new StreamSource(
new File("phonebook.xsl"));
// Set up output sink
Result outputXHTML = new StreamResult(
new File("output-templates.html"));
// Setup a factory for transforms
TransformerFactory factory = TransformerFactory.newInstance();
// Pre-compile instructions
Templates templates = factory.newTemplates(inputXSL);
// Get a transformer for this XSL
Transformer transformer = templates.newTransformer();
// Perform the transformation
transformer.transform(inputXML, outputXHTML);
} catch (TransformerConfigurationException e) {
System.out.println("The underlying XSL processor " +
"does not support the requested features.");
} catch (TransformerException e) {
System.out.println("Error occurred obtaining " +
"XSL processor.");
}
更多精彩
赞助商链接