2012-07-18 31 views
1

我想解析下面的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"> 

回答

0

如果XML中存在錯誤,爲什麼要忽略它? XML解析器旨在拒絕錯誤的XML。

它看起來像這個XML包含一個實體引用&acirc;但不包括定義此實體的DTD。這是標準的XHTML實體之一,因此您可以通過添加對XHTML中相關實體聲明DTD模塊的引用來修復XML。

+0

當然,我可以看看,但由於我沒有控制XML,我需要在解析之前先手動編輯字符串。我希望能避免這種情況。這裏的問題在於引用在RSS提要中的文章的正文中。大多數RSS生成器只是轉儲標籤之間的內容而不知道其中的內容。 – 2012-07-18 14:16:27

+0

我也編輯了這個問題,詢問如何最好地添加DTD。 – 2012-07-18 14:26:14

+0

是的,RSS生成器在遵從XML標準方面出了大問題。您需要在內容之前(但在任何XML聲明之後)添加doctype聲明'<!DOCTYPE ...>'。這可以引用外部DTD,也可以包含內聯的實體定義。添加DOCTYPE/DTD與添加命名空間不同,這就是您的示例所做的! – 2012-07-18 15:27:07