2011-12-13 34 views
2

我得到一些異常的XML文本輸入,如:Java庫逃脫/清理XML?

"<Tag>something</Tag> 8 > 3, 2 < 3, ... <Tag>something</Tag>" 

我要清理輸入這樣得到:

"<Tag>something</Tag> 8 &gt; 3, 2 &lt; 3, ... <Tag>something</Tag>" 

也就是說,逃避這些特殊符號像<,>時,仍能保留有效的標籤(「​​,請注意,在同一個案例中)

你知道任何java庫可以做到這一點嗎? 「程序)

+0

孤兒'>'字符不是問題。但是,如何判斷一個特定的'<'字符是一個標籤還是一個小於符號? XML文檔是否遵循單個DTD或XML Schema?或者,'<'*總是*後面跟着一個不是XML中的'Name'的數字嗎? – erickson

+0

他們不是我的XML文檔,也沒有模式。不幸的是,我發現一個「<」符號沒有被一個空格或數字跟隨的情況... – juanmirocks

回答

6

JTidy是「HTML語法檢查器和漂亮的打印。就像它的非Java表弟,JTidy可以作爲清理惡意和錯誤的HTML工具」

但它也可以用XML使用。檢查文檔。這是令人難以置信的聰明,它可能會爲你工作。

0

查看番石榴的XmlEscaper。它在版本11的預發佈中,但代碼可用。

+0

編號(至少從我讀的代碼中)像StringEscapeUtils.escapeXml一樣,一切都被轉義了,標籤。 – juanmirocks

+0

「適當標籤」的特殊符號是什麼意思? –

+0

看,'東西'的特殊符號不應該逃脫 – juanmirocks

-1

Apache Commons Lang包含一個名爲的類StringEscapeUtils它正是你想要的!我想要使​​用的方法是escapeXml

+0

不可以。它逃避一切,也是適當標籤的<,>符號。這是因爲它不理解xml結構,而是使用簡單的字符串替換。 – juanmirocks

+0

嗯,如果我對它有更多的瞭解...取決於你想用輸入做什麼,最好用XML解析器解析它。我懷疑只用字符串操作的工具知道作爲標籤一部分的< and >與作爲簡單文本一部分的工具之間的區別。另外,使用解析器可以讓你進一步處理輸入。不過,我不知道你的確切用例。 – r3nj1

1

最好的解決方案是修復生成文本輸入的程序。最簡單的這種修復將涉及像其他答案建議的轉義實用程序。如果這不是一種選擇,我會使用一個正則表達式像

</?[a-zA-Z]+ */?> 

以匹配預期的標籤,然後分割字符串成之間的廣告代碼(您想通過不變)和文本(反對你想申請一個逃生方法。)

我不會指望XML解析器能夠爲你做,因爲你正在處理的是不是有效的XML。現有的逃避行爲可能會產生歧義,因此您可能無法做出完美的工作。

+0

是的,我想這將是最簡單的解決方案。 – juanmirocks

2

我不知道任何圖書館會這樣做。你的輸入是畸形的XML,沒有合適的XML解析器會接受它。更重要的是,並不總是可以將實際標籤與看起來像標籤但實際上是文本的東西區分開來。因此,你爲解決問題所做的任何基於啓發式的嘗試都將是脆弱的;即偶爾會產生格式不正確的XML。

最好的方法是在組裝XML之前解決問題。

  • 如果您通過(例如)解析DOM來生成XML,那麼unparser將負責爲您轉義。
  • 如果您通過模板或字符串打擊生成XML,則需要在XML標記合併之前在相關文本塊上調用類似StringEscapeUtils.escapeXml的東西。

如果您在「XML」組裝完成後才能解決問題,則無法正確修復該問題。

+0

我不組裝XML。你是對的,任何基於啓發式的嘗試最終都會失敗。然而,我認爲/希望象@gatkin這樣的解決方案能夠爲我獲得的輸入做出貢獻。 – juanmirocks

+0

*「我不組裝XML」* - 那麼最好的解決方案是*拒絕* XML格式錯誤。使用您最喜愛的XML驗證器來提供書面證據。互操作性標準是標準,不符合它們的軟件是**越野車**,應該修復......不予補償。 –

+0

我抓取並獲取生物信息學數據庫提供的一些數據,我必須得到這些數據。不過,我明白你的觀點。 – juanmirocks