2009-11-27 65 views
2

我在JDK6中使用Xerces實現在HTML 4.0過渡文檔上執行XPath查詢。用下面的代碼:如何在HTML文件包含mdash時使用Xerces避免SAXParseException?

XPath newXPath = XPathFactory.newInstance().newXPath(); 
XPathExpression xpathExpr = newXPath.compile(expression); 
Object xPathResult = xpathExpr.evaluate(inputSource, XPathConstants.NODESET); 

inputSourceFileInputStream建成,我收到異常:

 
Caused by: org.xml.sax.SAXParseException: The entity "mdash" was referenced, but not declared. 
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239) 
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283) 
at com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:291) 

這個消息也打印到標準輸出:

 
[Fatal Error] :20:43: The entity "mdash" was referenced, but not declared. 

如何我可以避免這種異常嗎?

HTML文件是從XML的XSLT轉換中創建的。我不認爲我需要它是一個—,我不確定。 HTML將顯示在Java Swing應用程序中。

我很難判斷我的具體實施中的哪些信息與此問題相關。如果需要更多信息,請通過評論告訴我。因此,我認爲HTML是XML(根本就沒有想到這一點)的錯誤觀念。

因此,給定一個HTML文件,我該如何解決這個問題?

  • 給解析器提供HTML 4的DTD嗎?
  • 用等價物替代—。 HTML是通過XSLT轉換創建的,可以將樣式表設置爲使用等效數字符號替換mdash嗎?
  • 是否有任何庫在將HTML提供給解析器之前將其修復?我注意到JTidy出於類似的目的而被提及。

回答

2

我想我發現了我的具體情況的問題。該HTML文件是使用XSLT從XML文件生成的。通過改變線路:

<xsl:output method="html" /> 

到:

<xsl:output method="xml" /> 

轉型沒有創造&mdash;實體。輸出文件可以使用Xerces進行解析。

我不確定這是否「正確」,但它似乎在Swing中顯示。

+0

太糟糕了,我看到這有點晚了。是的,這也是一個適當和正確的解決方案。如果您可以生成「乾淨」的XML,則不需要JTidy。 – 2009-11-27 15:35:55

1

鑑於HTML不是XML我想你可能會發現嘗試使用XML解析器解析HTML Transitional時遇到很多問題。但是,如果您的HTML實際上是格式良好的XML,則通常會在DTD中定義mdash和其他實體。確保你的解析器具有文檔的DTD,它應該沒問題。

+0

+1提醒我HTML不是XML ;-) – Grundlefleck 2009-11-27 14:04:26

3

問題是,如果呈現給Xerces的文檔沒有聲明mdash的DTD,它不是格式良好的XML文檔 - 所有實體都必須聲明。 HTML有一組「內置」實體,HTML處理器需要知道這些實體,這些實體應該位於DTD中。

沒有DTD最簡單的解決方法將是等價的數值(&#x2014;&#8212;),以取代MDASH

+0

XHTML會出現這個問題嗎? – Grundlefleck 2009-11-27 13:56:42

+0

實體可以定義的唯一位置在DTD中。因此,如果文件具有DTD的DOCTYPE,則Xerces應該從那裏檢索實體。 – 2009-11-27 13:58:40

+0

另外一個問題是我在大學代理的後面工作,查找超時。我不希望弄亂代理,是否可以向Xerces提供一個本地DTD文件,並且我可以從w3c.org保存相關文件? – Grundlefleck 2009-11-27 14:03:33

3

在文件標題中的權DTD應該包含所有必要的實體的聲明,如果你的文件格式良好的解析器將會遵守這些信息。

如果有可能HTML格式不正確,我會推薦TagSoup庫來解決這個問題。它讀取輸入並嘗試生成有效的XHTML作爲輸出,從不報告任何分析錯誤,只是嘗試使用內置啓發式技術修復它們。我能夠成功處理來自Web的非常破碎的HTML,並對其進行XPath查詢(看起來像這是您需要的)。

1

面對這樣的問題,我運行(X)HTML通過JTidy。 JTidy會接受一個類似於HTML或XML的輸入,並給出適當的選項,將其轉換爲適合所有常用XML工具處理的格式良好的XML。

這節省了我處理可能出現的所有特殊和特殊情況的麻煩。我們一直在努力研究如何連接輸入和輸出,以及使用哪些選項;之後,它只是工作™。

這不是一個解決方案,您的具體問題與mdash –但我的懷疑是,這將是遠遠最後一個問題無論如何。

相關問題