2011-12-05 23 views
14

我有一個應用程序(與許多其他應用程序一樣)需要用戶輸入,將其存儲在數據庫中,然後使用(其中包括)XML工具對其進行處理。應用程序接受自由文本輸入,與其他許多開發人員一樣,我非常小心地進行轉義和引用,以便處理包含不同類型的空白,引號字符,保留的XML字符等的輸入。處理垂直製表符和其他無效xml字符的最佳做法

但是,有時用戶會管理輸入一個包含垂直製表符(十六進制0B)或換頁符(十六進制0C)的字符串。這無法由XML工具處理,導致應用程序崩潰。

在我的應用程序中,在「往返」過程中保留原始輸入非常重要,所以我不願意刪除任何我不喜歡的字符,尤其是偶爾使用的換頁符在純文本文件中。

當涉及到XML處理時,是否有任何可接受的最佳實踐或處理這些字符的一般策略?

回答

-3

你應該使用amperstand(�&#0x1F)將它們轉義出來,然後在最後解碼/恢復它們。

XmlTextWriter incorrectly writing control characters

+0

-1:這是沒有意義的。無效的XML不是XML。 –

+0

然後這個問題沒有意義。如果要求在XML中放入特殊的無效字符(可能有多麼無效),轉義仍然允許處理文件,而使用無效字符的邊緣情況必須由應用程序自己處理。也可以使用CDATA或任何其他格式。 – Vincent

+3

確實,這個問題沒有意義。另一種情況是開發人員被要求彌補發送數據的人員不理解XML的事實。 –

3

是的,不幸的是有些字符是XML非法的,沒有實體等同。作爲這些示例之一,請參閱:

http://www.jdom.org/docs/apidocs.1.1/org/jdom/Element.html#setText(java.lang.String) 

這是一個String setter ...可以拋出異常!垂直選項卡恰好是沒有XML實體的那些字符之一,也沒有辦法用XML單獨「轉義」它。

我正在通過使用base64編碼來清理可能包含這些字符的字符串來解決這個問題。這有點傻,因爲我必須始終進行64位編碼和解碼,但我認爲沒有好的選擇。