2012-05-03 16 views
2

我想使用經典的DOM解析Java中的多行XML屬性。解析工作得很好。但是,它破壞了換行符,所以當我渲染解析的字符串時,換行符被簡單的空格替換。在Java中解析XML多行字符串

<string key="help_text" value="This is a multi line long 
           text. This should be parsed 
           and rendered in multiple lines" /> 

爲了讓我使用的屬性:

attributes.getNamedItem("value").getTextContent() 

如果我只是通過一個手動輸入字符串使用「\ n」的渲染方法,如預期的文本被繪製。

任何想法?

+1

請發表您的代碼 – ControlAltDel

回答

3

我用JDOM這個在過去。在解碼多線屬性時,它爲您節省了很多麻煩,並且真正增強了Java上的XML解析/寫入。JDom也與Android開發兼容,它非常小(只有一個jar文件)。

https://github.com/hunterhacker/jdom

+0

我已經使用了第一個(也是非常難看的)「< br/>」解決方案作爲一個修補程序,但我會確定地考慮一下JDom。非常感謝。 –

+1

@Fsero - 你能簡單描述一下你如何使用JDom管理這個功能嗎?我剛剛寫了一個小的單元測試,並且在獲得JDom之前,屬性中的換行符在Xerces土地上被消滅。 – nullPainter

3

根據XML specification,XML解析器必須規範化屬性空白,例如用空格替換換行符。即如果您需要保留換行符,則不能使用屬性值。

一般來說,在XML空白處理是一個很大的麻煩。特別是,CR,LF和CRLF之間的區別不保存在任何地方。

您可能會發現將屬性編碼爲&lt;br /&gt;(即<br />的編碼版本)的新行編碼會更好,然後稍後將其解碼。

+1

@Ben根據XML規範CR/LF組合必須歸由XML處理器LF。 – erikxiv

+0

是的。因此,如果差異對您的應用程序很重要,您必須找到其他編碼方式 - 您自己製作的特殊標籤是理想的方法。 – Ben

2

the XML specifcation: 3.3.3屬性值標準化。你會看到,所有空格都normallised單位:

屬性的值傳遞給檢查有效性的應用程序或 之前,XML處理器必須是通過下面的算法標準化屬性 值,或者使用其他方法 ,以便傳遞給應用程序的值與該算法產生的值相同 。如2.11行尾處理中所述,所有換行符都必須標準化爲 ,因此該算法的其餘 對以這種方式標準化的文本進行操作。

以由空字符串組成的標準化值開始。

對於在 非標準化的屬性值中的每個字符,實體引用或字符引用,第一個開始,一直持續 到最後,請執行下列操作:

對於一個字符引用,被引用的字符附加到 標準化的值。

對於實體引用,遞歸地應用此算法的步驟3至 實體的替換文本。

對於空格字符(#x20,#xD,#xA,#x9),請將空格 字符(#x20)附加到標準化值。

對於另一個字符,將字符附加到規範化的值。