XML文件中的特殊字符 - 使用DOM API进行处理

时间:2009-05-16 08:13:05

标签: xml dom special-characters

我有一个XML格式的文件(仅包含根开始和结束标记,以及根目录的子标记)。儿童的文本元素包含&符号&amp ;.在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 &amp; looks funny on me. 
</review_text>
</review>

这是我提取的文件“negative_1”:

I will not wear it as it is too big & looks funny on me. 

对我而言,原始数据不是很重要(没有进行任何转换/替换),所以我认为我必须处理提取的文件“negative_1”,将&amp;转换回&amp ;.如你所见,似乎我不必这样做。但我不明白为什么:(。

提前谢谢!

2 个答案:

答案 0 :(得分:11)

原因很简单:XML文件确实包含 "&"个字符。

它只是以不同的方式表示(即它被“转义”),因为它自己的真实"&"会破坏XML文件,正如您所见。阅读XML 1.0规范中的相关部分:"2.4 Character Data and Markup"。这只是几行,但它很好地解释了这个问题。

XML是数据的表示(!)。不要将其视为文本文件。例如:

您希望将字符串“17&lt; 20”存储在XML文件中。最初,你不能,因为“&lt;”保留为开始标记括号。所以这将是无效的:

<xml>17 < 20</xml>

解决方案:您在特殊/保留字符上使用字符转义,只是为了保留文件的有效性:

<xml>17 &lt; 20</xml>

出于所有实际目的,上面的代码段包含以下数据(这次采用JSON表示形式):

{
  "xml": "17 < 20"
}

这就是您在后期处理中看到真实"&"的原因。它以同样的方式逃脱了,但意味着始终保持不变。

上面的例子也解释了为什么必须特别对待"&":它本身是XML转义机制的一部分。它标记了转义序列的开始,就像在"&lt;"中一样。因此,它必须自行转义(使用"&amp;",就像你已经完成的那样)。

答案 1 :(得分:2)

任何XML解析器都会隐式地将&amp;&lt;&gt;等实体转换为相应的字符,作为解析文件过程的一部分。