我正在尝试使用经典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方法,则会按预期绘制文本。
有什么想法吗?
答案 0 :(得分:3)
根据XML specification,XML解析器必须规范化属性空白,例如用空格替换换行符。即如果您需要保留换行符,则无法使用属性值。
通常,XML中的空白处理很麻烦。特别是,CR,LF和CRLF之间的差异不会保留在任何地方。
您可能会发现将属性中的换行符编码为<br />
(即<br />
的编码版本)会更好,然后再对其进行解码。
答案 1 :(得分:3)
我过去曾经使用过JDom。在解码多线程属性时,它可以为您节省很多麻烦,并且真正增强了Java上的XML解析/写入功能。 JDom也兼容Android开发,它非常小(只有一个jar文件)。
答案 2 :(得分:2)
来自the XML specifcation: 3.3.3属性值规范化。您将看到所有空格都被标准化为单个空格:
在将属性的值传递给应用程序之前或 检查有效性,XML处理器必须规范化属性 通过应用下面的算法,或通过使用一些其他方法的值 这样传递给应用程序的值与该值相同 由算法产生。所有换行必须已经标准化 在输入#xA时,如2.11行尾处理中所述,其余部分 该算法对以这种方式归一化的文本进行操作。
以由空字符串组成的标准化值开始。
对于每个字符,实体引用或字符引用 非标准化属性值,从第一个开始并继续 到最后,执行以下操作:
对于字符引用,将引用的字符附加到 标准化值。
对于实体引用,递归地应用此算法的第3步 实体的替换文本。
对于空格字符(#x20,#xD,#xA,#x9),请添加空格 字符(#x20)到标准化值。
对于另一个字符,将字符附加到标准化值。