我尝试使用 XSLT 转换 XML 文档。作为输入,我有 www.wordpress.org XHTML 源代码,XSLT 是检索站点标题的虚拟示例(实际上它什么也做不了 - 它不会改变任何东西)。
我使用的每个 API 或库,转换大约需要 2 分钟!如果您查看 wordpress.org 源代码,您会发现它只有 183 行代码。正如我在 google 上搜索到的,这可能是由于 DOM 树构建造成的。无论 XSLT 多么简单,它总是需要 2 分钟——因此它证实了它与 DOM 构建相关的想法,但无论如何,我认为它不应该花费 2 分钟。
这是一个示例代码(没什么特别的):
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = tFactory.newTransformer(
new StreamSource("/home/pd/XSLT/transf.xslt"));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
System.out.println("START");
try {
transformer.transform(new SAXSource(new InputSource(
new FileInputStream("/home/pd/XSLT/wordpress.xml"))),
new StreamResult(outputStream));
} catch (TransformerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("STOP");
System.out.println(new String(outputStream.toByteArray()));
在 START 和 STOP 之间,java“暂停”了 2 分钟。如果我查看处理器或内存使用情况,没有任何增加。看起来 JVM 真的停止了......
您是否有转换超过 50 行(这是随机数;))的 XML 的经验?据我了解,XSLT 总是需要构建 DOM 树才能完成其工作。快速转型对我来说至关重要。
提前致谢,
皮奥特尔
示例 HTML 文件是否使用命名空间?如果是这样,您的 XML 解析器可能会尝试从名称空间 URI 检索内容(可能是架构)。如果每次运行正好花费两分钟,则很可能出现这种情况——很可能是一次或多次 TCP 超时。
您可以通过计时实例化所需的时间来验证这一点InputSource
对象(实际上解析 WordPress XML 的地方),因为这可能是导致延迟的行。查看您发布的示例文件后,它确实包含声明的命名空间(xmlns="http://www.w3.org/1999/xhtml"
).
要解决此问题,您可以实施自己的EntityResolver http://download.oracle.com/javase/6/docs/api/org/xml/sax/EntityResolver.html这实际上禁用了基于 URL 的解析。您可能需要使用 DOM —— 请参阅DocumentBuilder
's setEntityResolver http://download.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilder.html#setEntityResolver%28org.xml.sax.EntityResolver%29 method.
这是一个使用 DOM 并禁用分辨率的示例(注意——这是未经测试的):
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbFactory.newDocumentBuilder();
db.setEntityResolver(new EntityResolver() {
@Override
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
return null; // Never resolve any IDs
}
});
System.out.println("BUILDING DOM");
Document doc = db.parse(new FileInputStream("/home/pd/XSLT/wordpress.xml"));
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(
new StreamSource("/home/pd/XSLT/transf.xslt"));
System.out.println("RUNNING TRANSFORM");
transformer.transform(
new DOMSource(doc.getDocumentElement()),
new StreamResult(outputStream));
System.out.println("TRANSFORMED CONTENTS BELOW");
System.out.println(outputStream.toString());
} catch (Exception e) {
e.printStackTrace();
}
如果你想使用 SAX,你必须使用SAXSource http://download.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/sax/SAXSource.html#SAXSource%28org.xml.sax.XMLReader,%20org.xml.sax.InputSource%29与XMLReader http://download.oracle.com/javase/1.5.0/docs/api/org/xml/sax/XMLReader.html它使用您的自定义解析器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)