2010-07-23 73 views
1

解析不正確生成的XML文檔時,我得到這個錯誤:配置的Xerces SAX解析器容忍的XML語法錯誤

org.xml.sax.SAXParseException: The value of attribute "bar" associated with an element type "foo" must not contain the '<' character. 

我知道是什麼原因造成的問題。這是這一行:

<foo bar="x<y">42</foo> 

應該已經

<foo bar="x&lt;y">42</foo> 

我知道,這不是有效的XML,但我的代碼必須下載和分析類似的文件無人值守和出於政治原因,它可能不可能說服供應商修復有問題的程序,尤其是當其他程序正在讀取文件並容忍此錯誤時。

有什麼辦法可以配置Xerces來容忍它嗎?目前它將其視爲致命錯誤。實現ErrorHandler忽略它是不令人滿意的,因爲然後文檔的其餘部分未被解析。

或者,你可以建議另一個可以配置爲容忍這個錯誤的基於流的解析器嗎?使用DOM解析器不可行,因爲這些文檔會運行到數百兆字節。

+2

這是一個政治問題。它需要政治解決方案,而不是技術方案。 – 2010-07-23 07:25:28

+1

Xerces可能不會容忍它,但是像jsoup這樣的替代庫(https://jsoup.org/)可能更適合這種情況。它看起來最初是爲HTML設計的,但是我已經使用它來成功地從錯誤的XML中讀取數據。 http://stackoverflow.com/questions/9886531/how-to-parse-xml-with-jsoup – 2016-10-17 21:43:30

回答

4

我不認爲你會找到任何可以容忍這種錯誤的XML解析器。我可以建議的唯一事情就是預先處理XML以消除可能發生的錯誤。

+2

有關預處理的有趣之處,如果你想到它在所提供的示例中使用,那就是你需要理解各種XML上下文,如新節點的開始等。換句話說,一些基本的XML解析邏輯本身需要完成,它可以識別上下文中對XML編碼的需求並應用它。看起來它會涉及像OP想要的那樣編​​寫一個「寬容」的XML解析器。 – 2010-07-23 10:46:39

+1

@Vineet。問題在於它不能以一般方式完成。預處理需要基於@ finnw關於供應商XML應該是什麼樣的知識,觀察到的錯誤的系統化以及基於模式的匹配和糾正來完成。沒有使用@ finnw的知識,可能會有很多可能的更正,並且沒有辦法讓假設的容錯解析器選擇正確的解析器。 – 2010-07-23 12:15:02

+0

@Stephen,這就是爲什麼預處理不能成爲一攬子解決方案的原因。可以使用正則表達式和其他方案來發現這些錯誤,但是如果它們是隨機的並且可能出現在任何屬性值或文本節點中,那麼是什麼? – 2010-07-23 12:21:15

5

...和出於政治原因,它可能無法說服供應商來修復錯誤程序......

出於政治原因,你應該嘗試您damnedest讓他們要解決這個問題。在他們面前提出需求規格說明輸入必須是格式良好的XML。威脅要開發一個定製解析器的費用向他們收費。 (好吧,這可能不會起作用...)

放棄而不打架,你只是讓問題麻煩其他人在未來不得不與這個供應商打交道。