2011-05-11 31 views
4

我已經給了一個xml字符串,我需要通過解析器。它目前抱怨,因爲一個非法的XML字符。很簡單的例子:如何讓我的XML安全解析(當它有&字符)?

<someXml>this & that</someXml> 

我知道解決的辦法是用&amp;更換&,但我不生成XML,因此有超過值的控制。

一個簡單的字符串替換是不是這個,因爲「&」以正確的方式有特殊含義的XML和「&」與全局替換「&放大器;」會毀掉原本打算的特殊意義。有沒有一種解決方案來獲取完整的xml文檔並「修復」它,以便'&'變成'& amp'',但僅限於預期的位置?我可以安全地將'&'替換爲'& amp; '(注意兩邊的空格)?

+0

您給出的字符串不是xml,所以沒有必要將它交給XML解析器,除非您對錯誤消息感興趣。要處理非XML數據,您需要一個非XML解析器。 –

+0

好,好點,雖然我的目標是將上述內容轉換爲有效的XML,然後解析它。 (或者如你所說,使用非XML解析器來解析它)。 –

回答

4

我認爲這是一個有趣的問題,因爲這是一種真實情況。雖然我認爲正確的做法是要求XML提供者修復XML並使其有效,但我認爲一種選擇是嘗試使用寬鬆的解析器。我做了一些搜索,我發現這個blog post談論這個相同的問題,並建議我想到的相同的解決方案。您可以嘗試使用jsoup。讓我重複一遍,我認爲這不是最好的做法:你應該真的要求XML提供者來解決它。

+0

感謝MarcoS,我喜歡你的想法寬鬆的解析器,但我認爲你是對的,我真的應該回去了給提供商並要求格式正確的XML! –

0

你不能這樣做,因爲你破壞了XML字符(編碼她)。您必須將您的代碼重新編寫到生成XML的庫中。

0

不清楚你是否從這個問題中自己生成XML,但如果你是這樣,你可能想用一個XML庫來做到這一點,因爲它將首先正確地處理編碼事情。

但它聽起來像是你給的一段XML,所以我會建議使用Apache Commons Lang來做到這一點。它有一個'StringEscapeUtils'類,它有你正在尋找的方法escapeXml(String)。

+0

謝謝尼古拉斯。我自己並沒有生成xml(或者它很容易修復),所以不幸的是StringEscapeUtils不適用於我。 –

+0

StringEscapeUtils可以在傳遞給它的字符串上工作,比如你擁有的字符串。但現在我想到了,如果您要傳入整個XML文檔,它可能會逃避整個事情!可能不是你要找的... –

0

爲什麼不在使用其他XML內容的XML標籤中使用CDATA部分?然後,孤獨的&符號不會是一個問題。

+0

這將工作,除了我不生成的XML :( –

8

我會建議問這個文件的提供者來解決它。因爲它是不是(有效)XML!如果他們自己致力於XML格式,他們應該修復它。