在Java中解析XML多行字符串

时间:2012-05-03 21:02:35

标签: java xml parsing dom xml-parsing

我正在尝试使用经典DOM解析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”将手动输入的字符串传递给render方法,则会按预期绘制文本。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

根据XML specification,XML解析器必须规范化属性空白,例如用空格替换换行符。即如果您需要保留换行符,则无法使用属性值。

通常,XML中的空白处理很麻烦。特别是,CR,LF和CRLF之间的差异不会保留在任何地方。

您可能会发现将属性中的换行符编码为&lt;br /&gt;(即<br />的编码版本)会更好,然后再对其进行解码。

答案 1 :(得分:3)

我过去曾经使用过JDom。在解码多线程属性时,它可以为您节省很多麻烦,并且真正增强了Java上的XML解析/写入功能。 JDom也兼容Android开发,它非常小(只有一个jar文件)。

https://github.com/hunterhacker/jdom

答案 2 :(得分:2)

来自the XML specifcation: 3.3.3属性值规范化。您将看到所有空格都被标准化为单个空格:

  

在将属性的值传递给应用程序之前或   检查有效性,XML处理器必须规范化属性   通过应用下面的算法,或通过使用一些其他方法的值   这样传递给应用程序的值与该值相同   由算法产生。所有换行必须已经标准化   在输入#xA时,如2.11行尾处理中所述,其余部分   该算法对以这种方式归一化的文本进行操作。

     

以由空字符串组成的标准化值开始。

     

对于每个字符,实体引用或字符引用   非标准化属性值,从第一个开始并继续   到最后,执行以下操作:

     

对于字符引用,将引用的字符附加到   标准化值。

     

对于实体引用,递归地应用此算法的第3步   实体的替换文本。

     

对于空格字符(#x20,#xD,#xA,#x9),请添加空格   字符(#x20)到标准化值。

     

对于另一个字符,将字符附加到标准化值。