0

我有这个方法,它从java.io.InputStream返回的org.w3c.dom.Document.

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)

谢谢您的帮助。

4

1 回答 1

1

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

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

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

于 2012-05-24T07:14:50.850 回答