5

我有一个 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 &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;&。如您所见,看来我不必这样做。但我不明白为什么:(。

先感谢您!

4

2 回答 2

11

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

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

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

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

<xml>17 < 20</xml>

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

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

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

{
  "xml": "17 < 20"
}

这就是为什么您"&"在后期处理中看到真实的原因。它以同样的方式被逃脱,但它的意义一直保持不变。

上面的例子也解释了为什么"&"必须特别对待它:它本身就是 XML 转义机制的一部分。它标志着转义序列的开始,如"&lt;". 因此,它必须自行转义(使用"&amp;",就像您所做的那样)。

于 2009-05-16T08:24:43.990 回答
2

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

于 2009-05-16T08:23:26.863 回答