use*_*155 5 xml dom special-characters
我有一个XML格式的文件(仅包含根开始和结束标记,以及根目录的子项).子元素的文本元素包含&符号&.在XML中,不允许使用此符号以使文档有效,当我尝试使用Java中的DOM API和XML解析器处理文件时,我获得了解析错误.因此,我已经替换了&&,并且我成功处理了文件:我必须在不同的纯文本文件中提取文本元素的值.
当我打开这些新创建的文本文件时,我希望看到&,但是有了&而不是.为什么是这样?我已经将文本存储在没有任何扩展名的文本文件中(我的XML格式的原始文件也没有.xml扩展名),而且我确实只是在新文件的文本中,无论我如何打开文件:作为txt或xml文件(这些是我的XML编辑器中的一些选项).究竟发生了什么?Java(?)&会自动转换为&吗?或者有一些默认编码?嗯,&代表&,我想有一些"看不见的"自动转换,但我很困惑何时以及如何发生这种情况.以下是我使用Java处理原始文件后收到的原始文件和提取文件的示例:
这是我的XML格式的"negative.review"文件:
<review>
<review_text>
I will not wear it as it is too big & looks funny on me.
</review_text>
</review>
Run Code Online (Sandbox Code Playgroud)
这是我提取的文件"negative_1":
I will not wear it as it is too big & looks funny on me.
Run Code Online (Sandbox Code Playgroud)
对我来说重要的是原始数据原样(没有进行任何转换/替换),所以我认为我必须处理提取的文件"negative_1"转换回&&.如你所见,似乎我不必这样做.但我不明白为什么:(.
先感谢您!
Tom*_*lak 11
原因很简单:XML文件确实包含一个"&"字符.
它只是以不同的方式表示(即它被"转义"),因为"&"正如你所见,它本身就是一个真正的XML文件.阅读XML 1.0规范中的相关部分:"2.4字符数据和标记".这只是几行,但它很好地解释了这个问题.
XML是数据的表示(!).不要将其视为文本文件.例:
您希望将字符串"17 <20"存储在XML文件中.最初,您不能,因为"<"被保留为开始标记括号.所以这将是无效的:
<xml>17 < 20</xml>
Run Code Online (Sandbox Code Playgroud)
解决方案:您在特殊/保留字符上使用字符转义,只是为了保留文件的有效性:
<xml>17 < 20</xml>
Run Code Online (Sandbox Code Playgroud)
出于所有实际目的,上面的代码段包含以下数据(这次以JSON表示):
{
"xml": "17 < 20"
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么你"&"在后期处理中看到真实的原因.它以同样的方式逃脱了,但它的意思始终保持不变.
上面的例子也解释了为什么"&"必须特别对待它:它本身是XML转义机制的一部分.它标志着转义序列的开始,就像在"<".因此它必须自己逃脱("&"就像你一样).