使用DocumentBuilder“解析”解析XHTML时的无限循环

时间:2012-05-23 22:46:37

标签: java xml xhtml xml-parsing infinite-loop

我有这个方法从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)

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你的诊断是无限循环是不正确的;它只需要很长时间,这不是一回事。

通常的原因是该文档包含对W3C网站上的XHTML DTD的引用,并且解析器将访问Web以获取此文件而不是使用本地副本。大约一年前,W3C开始对这些常见的DTD进行“限制”请求,因为它们无法再处理流量。

通常的解决方案是使用解析器将请求重定向到本地副本。