2011-08-30 96 views
2

我目前解析XHTML文檔與DOM解析器,如:Java的XML解析:避免實體引用解析

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setValidating(false); 

final DocumentBuilder db = dbf.newDocumentBuilder(); 
db.setEntityResolver(MY_ENTITY_RESOLVER); 
db.setErrorHandler(MY_ERROR_HANDLER); 
... 
final Document doc = db.parse(inputSource); 

而我的問題是,當我的文檔包含好像是實體引用,例如:

<p>&euro;</p> 

我的解析器爲包含「€」而不是「& euro;」的內容創建了一個Text節點。這就是說,它正在以應有的方式解決實體(XHTML 1.0 Strict DTD鏈接到ENTITIES Latin1 DTD,後者又建立了「& euro」與「€」的等價關係)。

問題是,我不希望解析器做這樣的事情。 我想保留「&歐元」;文字未修改

我已經試過:

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setExpandEntityReferences(false); 

但是:

  1. 我不喜歡這一點,因爲我擔心這可能使一些解析器實現不導航從XHTML 1.0嚴格的DTD到實體Latin1 DTD,因此不考慮「&歐元;」作爲宣佈爲實體。

  2. 當我這樣做時,它奇怪地創建了兩個節點:一個「磅」實體節點和一個帶有「€」符號的文本節點。

任何想法?是否有可能在一個DOM解析器,而不訴諸預處理的XHTML而代所有的「&」符號的東西,其他的?配置此...

解決方案可能是一個DOM解析器或者也可以是SAX之一,我不介意使用SAX解析,然後使用轉換創建我的DOM ...

另外,我無法切換到非標準XML解析庫。沒有jdom,沒有jsoup,沒有HtmlCleaner等。

非常感謝。

+0

_My解析器創建你如何測試這個文本節點.._? – Wivani

回答

2

我採取的方法是用Xerces將其視爲純文本的唯一標記替換任何實體。一旦轉換成Document對象,標記將被實體引用對象替換。

http://sourceforge.net/p/commonclasses/code/14/tree/trunk/src/com/redhat/ecs/commonutils/XMLUtilities.java的convertStringToDocument()函數

+1

是的,經過大量搜索和測試後,我終於做了類似這樣的事情:我創建了一個讀取器(java.io.BufferedReader的擴展),用於通過另一個符號從XML實體中快速替換'&'符號然後後處理解析的文檔,用符號代替這些符號。 它看起來不乾淨,因爲它不是;-),但它的工作原理。 –