示例HTML文件是否使用命名空间?如果是这样,您的XML解析器可能正在尝试从命名空间URI中检索内容(可能是模式)。如果每次运行只需要两分钟就可能发生这种情况 - 可能是一次或多次TCP超时。
您可以通过计算实例化InputSource对象(实际解析WordPress XML)所需的时间来验证这一点,因为这可能是导致延迟的行。在查看您发布的示例文件后,它确实包含一个声明的命名空间(xmlns="http://www.w3.org/1999/xhtml")。
要解决此问题,您可以实现自己的EntityResolver,它基本上会禁用基于URL的解决方案。您可能需要使用DOM - 请参阅DocumentBuilder的setEntityResolver方法。
这是使用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与使用自定义解析程序的XMLReader一起使用。