2010-05-11 70 views
7

我正在使用Java的DocumentBuilder.parse(InputStream)來解析XML文檔。偶爾,我得到格式不正確的XML文檔,因爲最後的>導致SAXException: Content is not allowed in trailing section後有額外的垃圾。 (在我看到的情況下,垃圾只是一個或多個空字節。)忽略「內容不被允許在尾部」SAXException

我不在乎最後的>之後會發生什麼。有沒有簡單的方法來解析Java中的整個XML文檔,並讓它忽略任何後續垃圾?

請注意,通過「忽略」,我並不是簡單地意味着要捕捉並忽略該異常:我的意思是忽略尾隨垃圾,不會拋出異常,並返回Document對象,因爲XML至多包括最終>有效。

回答

8

由於您的發件人正在向您顯示無效的XML,因此如果您想避免此異常,則需要在它遇到解析器之前進行更正。如果您無法更正發件人,則需要進行某種預處理步驟。

如果情況僅僅是在結束標記之後有額外的空字節,並且您對其他答案的答覆已經指明瞭這一點,那麼您可以通過將輸入流包裝爲FilterInputStream實現以跳過空字節。

如果問題比空字符更復雜,那麼您當然需要更復雜的過濾器,這可能很困難。

如果您使用的是ContentHandler,您可以添加一個回調函數,以便在處理結束根標記時通知調用代碼,並且根據這些知識,調用代碼可以在其中包含邏輯處理程序的異常,如果簡單地忽略它的結尾已被髮信號。 在這一點上,解析器必須完成的任何事情都可能已經完成!但是這個解決方案似乎不適用於你的情況。

-5

否。包含尾隨字符的文檔不是XML文檔。修復發件人。

+3

我無法控制發件人。而你的「答案」並不符合「你接受的要寬鬆,對你的要求嚴格」。 – 2010-05-11 23:31:15

+0

您問「是否有一種簡單的方法來解析Java中的整個XML文檔,並讓它忽略任何後續垃圾?」答案是「不,沒有」,我給出了原因。也許你正在尋找http://home.ccil.org/~cowan/XML/tagsoup/?也許你知道你的XML沒有CDATA,你可以實現一個原始的inputStream包裝器?我不確定你在找什麼答案。 – 2010-05-12 00:01:07

+0

每個XML解析器都會跟蹤每個元素,並通過解析其結束標記的>來知道何時該元素已「關閉」。這意味着每個XML解析器也知道最終>何時它看到它,因爲第一個元素已通過其結束標記進行了平衡。那時候,我想讓解析器停下來。你讓這個比現在更復雜。 – 2010-05-12 00:24:06