我有這種方法,它從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