什么时候需要转义XML中的字符?

时间:2011-08-01 12:15:13

标签: xml soap escaping

我们应该何时将XML中的< > & " '替换为&lt等字符

我的理解是,只是为了确保如果XML的内容部分有> <,则解析器不会处理标记的开头或结尾。

另外,如果我有一个XML:

<hello>mor>ning<hello>

应该替换为:

  • &lthello&gtmor&gtning&lthello&gt
  • &lthello&gtmor>ning&lthello&gt
  • <hello>mor&gtning<hello>

我不明白为什么需要更换。什么时候需要它,究竟应该更换什么(标签或文字)?

5 个答案:

答案 0 :(得分:9)

XML Specification的第2.4节明确指出:

  

&符号(&amp;)和左尖括号(&lt;)不得   以字面形式出现,除非用作标记分隔符,   或在评论,处理指令或CDATA部分内。如果   它们在别处需要,必须使用数字进行转义   字符引用或字符串“&amp; amp;”和“&amp; lt;”   分别。可以使用以下来表示右尖括号(&gt;)   字符串“&amp; gt;”,并且为了兼容性,必须使用其中任何一个进行转义   “&amp; gt;”或出现在字符串“]]&gt;中的字符引用   “在内容中,当该字符串未标记CDATA的结尾时   部分。

答案 1 :(得分:8)

<>&"'在XML中都有特殊含义(例如“实体的开头”或“属性值”分隔符“)。

为了让这些字符显示为数据(而不是它们的特殊含义),它们可以由实体代表(&lt;代表<等等。)

有时这些特殊含义是上下文敏感的(例如“并不意味着”属性定界符“在标记之外),并且有些地方可以将它们作为数据显示为原始。而不是担心这些异常,它最简单如果你想避免它们的特殊含义,它们总是将它们表示为实体。然后唯一的问题是显式CDATA部分,其中特殊含义不成立(并且&不会启动实体)。

  

应该替换为

不应将其表示为任何一种。实体必须以分号结尾。

如何表示它取决于您的数据示例位和标记位。例如,您没有说过,<hello>应该是数据还是hello元素的开始标记。

答案 2 :(得分:5)

您必须对所有在XML中具有特殊含义的字符进行编码,但不应由解析器解释。

假设您的XML

<hello>mor>ning</hello> 

你会把它编码为

<hello>mor&gt;ning</hello>

或使用CDATA [Wikipedia]部分:

<hello><![CDATA[mor>ning]]></hello>

答案 3 :(得分:1)

您可以看到此解释enter link description here 但基本上,像&lt;和&gt;在解析xml文档时很重要。如果xml节点文本或属性文本中包含额外的这些特殊字符,则解析器将无法正确理解该文档。如果要将xml发送到某个Web服务,则应正确转义所有特殊字符。

答案 4 :(得分:1)

https://github.com/savonrb/gyoku/blob/master/README.md

你可以使用Gyoku来逃避CDATA中的角色。