我有这个方法从java.io.InputStream
返回org.w3c.dom.Document
来加载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);
进入无限循环。
修改
@Michael Kay发现了这个问题,但我在等待他的解决方案。其他可能的解决方案之一是忽略DTD:
domFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false)
感谢您的帮助。
答案 0 :(得分:1)
我认为你的诊断是无限循环是不正确的;它只需要很长时间,这不是一回事。
通常的原因是该文档包含对W3C网站上的XHTML DTD的引用,并且解析器将访问Web以获取此文件而不是使用本地副本。大约一年前,W3C开始对这些常见的DTD进行“限制”请求,因为它们无法再处理流量。
通常的解决方案是使用解析器将请求重定向到本地副本。