我想解析下面的URL作爲Java中的DOM文檔:http://www.op.org/en/rss-category-home/8。用Xerces忽略奇怪的分析錯誤
然而,當我這樣做,我得到以下錯誤:
13:51:38,470 ERROR ~ Error processing site Site 1
org.xml.sax.SAXParseException: The entity "acirc" was referenced, but not declared.
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
at logic.server.RssReader.readRss(RssReader.java:44)
at logic.server.GatherData.doJobWithResult(GatherData.java:49)
at logic.server.GatherData.doJobWithResult(GatherData.java:1)
我讀的地方,在當前JRE Xerces解析器是具有與此相關的一個bug,所以下載Xerces2的2.11.0,但仍然有同樣的問題。
我該如何解決這個問題。我無法控制RSS提要本身,但需要解析XML來處理文章。
我的代碼是: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document dom = builder.parse(rssUrl.openStream());
NodeList nodes = dom.getElementsByTagName("item");
etc. etc.
任何有助於解決這個問題真的很感激!
編輯: 如果我會嘗試下面的解決方案,並添加DTD,我會在那裏做什麼?當前的RSS元素是:
<rss version="2.0" xml:base="http://www.op.org/en/rss-category-home/8" xmlns:dc="http://purl.org/dc/elements/1.1/" content="http://purl.org/rss/1.0/modules/content/" dc="http://purl.org/dc/terms/" foaf="http://xmlns.com/foaf/0.1/" og="http://ogp.me/ns#" rdfs="http://www.w3.org/2000/01/rdf-schema#" sioc="http://rdfs.org/sioc/ns#" sioct="http://rdfs.org/sioc/types#" skos="http://www.w3.org/2004/02/skos/core#" xsd="http://www.w3.org/2001/XMLSchema#">
或者我會將它添加到每個包含XHTML代碼的'description'元素,像這樣?我試過這個後來的解決方案,但它仍然給出了同樣的錯誤。
<description xmlns="http://www.w3.org/1999/xhtml">
當然,我可以看看,但由於我沒有控制XML,我需要在解析之前先手動編輯字符串。我希望能避免這種情況。這裏的問題在於引用在RSS提要中的文章的正文中。大多數RSS生成器只是轉儲標籤之間的內容而不知道其中的內容。 – 2012-07-18 14:16:27
我也編輯了這個問題,詢問如何最好地添加DTD。 – 2012-07-18 14:26:14
是的,RSS生成器在遵從XML標準方面出了大問題。您需要在內容之前(但在任何XML聲明之後)添加doctype聲明'<!DOCTYPE ...>'。這可以引用外部DTD,也可以包含內聯的實體定義。添加DOCTYPE/DTD與添加命名空間不同,這就是您的示例所做的! – 2012-07-18 15:27:07