我有这种方法,它从java.io.InputStream
加载一个XHTML文档,返回一个org.w3c.dom.Document
。使用DocumentBuilder解析XHTML时出现无限循环“解析”
private Document loadDocFrom(InputStream is) throws SAXException,
IOException, ParserConfigurationException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory
.newInstance();
domFactory.setNamespaceAware(true); // never forget this
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(is);
is.close();
return doc;
}
此方法,我有一些XHTML文档(例如http://pastebin.com/L2kHwggU
)和XHTML网站进行了测试。
但是,对于某些文档,例如此http://pastebin.com/v675yWSJ甚至像www.w3.org
这样的网站,它会在Document doc = builder.parse(is);
处进入无限循环。
编辑:
@迈克尔凯发现了这个问题,但我在等待他的解决方案。
一个其他可能的解决方案是忽略DTD:
domFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
谢谢您的帮助。
你确定循环是无限的吗?大多数模板处理语言为每个感兴趣的标记发出事件。如果你在事件列表中有一个中断点,你可能会有很多令牌可以通过。 – nsfyn55
我没有添加任何“事件”到该“事件列表”,实际上,我从来没有听说过它。那么你如何解释我可以解析一些XHTML文档,如http://pastebin.com/L2kHwggU? 另外,我调试了源代码,并且一步一步地将它始终卡在那一行“next()”。 – anahnarciso
它没有在源代码中的调试语句永远运行吗? – nsfyn55