2

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

有任何想法吗?

4

3 回答 3

3

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

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

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

于 2012-05-03T21:13:25.387 回答
3

我过去曾为此使用过 JDom。它在解码多行属性时为您省去了很多麻烦,并真正增强了 Java 上的 XML 解析/编写。JDom 还兼容 Android 开发,而且非常小(只有一个 jar 文件)。

https://github.com/hunterhacker/jdom

于 2012-05-03T21:26:49.827 回答
2

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

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

从由空字符串组成的规范化值开始。

对于非规范化属性值中的每个字符、实体引用或字符引用,从第一个开始到最后一个,执行以下操作:

对于字符引用,将引用的字符附加到规范化值。

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

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

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

于 2012-05-03T21:15:45.223 回答