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

Koz*_*lov 11 xml soap escaping

什么时候我们应该用< > & " 'XML 替换&lt等字符等.

我的理解是,只是为了确保如果XML的内容部分具有> <解析器将不会处理标记的开始或结束.

另外,如果我有一个XML:

<hello>mor>ning<hello>
Run Code Online (Sandbox Code Playgroud)

应该替换为:

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

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

Cum*_*yah 9

XML规范的第2.4节明确指出:

&符号(&)和左尖括号(<)不得以其文字形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分.如果在其他地方需要它们,则必须分别使用数字字符引用或字符串"&"和"<"进行转义.右尖括号(>)可以使用字符串">"表示,并且为了兼容性,当它出现在字符串"]]>"内容中时,必须使用">"或字符引用进行转义,当该字符串未标记CDATA部分的结尾时.


Que*_*tin 8

<,>,&,"并且'都在XML特殊含义(如"实体的开始"或"属性值分隔符").

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

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

应该替换为任何一个

它不应该被表示为任何一个.实体必须以分号结尾.

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


Fel*_*ing 6

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

假设您的XML是

<hello>mor>ning</hello> 
Run Code Online (Sandbox Code Playgroud)

你会把它编码为

<hello>mor&gt;ning</hello>
Run Code Online (Sandbox Code Playgroud)

或使用CDATA [维基百科]部分:

<hello><![CDATA[mor>ning]]></hello>
Run Code Online (Sandbox Code Playgroud)

  • 实际上,没有严格的必要编码">"除了在一个特定的情况:如果它遵循"]]" - 这是因为序列"]]>"必须只被用作用于CDATA结束标记,如每XML规范.但是许多XML生成器只是为了方便而逃避它,即使解析器在文本内容中使用'>'也没有问题. (3认同)