Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java解析XML多行字符串_Java_Xml_Parsing_Dom_Xml Parsing - Fatal编程技术网

用Java解析XML多行字符串

用Java解析XML多行字符串,java,xml,parsing,dom,xml-parsing,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

我正在尝试使用经典的DOM解析Java中的多行XML属性。解析工作正常。但是,它破坏了换行符,因此,当我渲染解析的字符串时,换行符会被简单的空格替换

<string key="help_text" value="This is a multi line long
                               text. This should be parsed
                               and rendered in multiple lines" />
如果我只是使用“\n”将手动键入的字符串传递给render方法,文本将按预期绘制

有什么想法吗?

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

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

您可能会发现最好将属性中的换行符编码为
br/
(即

的编码版本),然后在以后对其进行解码。

来源: 3.3.3属性值规范化。您将看到,所有空白都已标准化为单个空格:

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

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

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

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

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

对于空白字符(#x20、#xD、#xA、#x9),请附加空格 将字符(#x20)设置为规范化值

对于另一个字符,将该字符附加到规范化值


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


@Ben根据XML规范,XML处理器必须将CR/LF组合规范化为LF。是的。因此,如果差异对您的应用程序很重要,那么您必须找到其他编码方法—您自己制作的特殊标记是理想的方法。目前,我使用了第一个(也是非常难看的)“br/”解决方案作为修复方案,但我肯定会研究JDom。非常感谢。@Fsero-您能简要描述一下您是如何使用JDom来管理它的吗?我刚刚编写了一个小单元测试,在Xerces land中,属性中的换行符甚至在进入JDom之前就被清除了。
attributes.getNamedItem("value").getTextContent()