我需要在XML文档中转义哪些字符?


Answers:


1355

如果您使用适当的类或库,它们将为您进行转义。许多XML问题是由字符串串联引起的。

XML转义字符

只有五个:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;

转义字符取决于使用特殊字符的位置。

可以在W3C标记验证服务处验证示例。

文本

安全的方法是转义文本中的所有五个字符。然而,三个字符"'>不用文字进行转义:

<?xml version="1.0"?>
<valid>"'></valid>

属性

安全的方法是转义属性中的所有五个字符。但是,>无需在属性中对字符进行转义:

<?xml version="1.0"?>
<valid attribute=">"/>

'如果引号是":,则不必在属性中对字符进行转义:

<?xml version="1.0"?>
<valid attribute="'"/>

同样,"如果引号是':,则不必在属性中转义:

<?xml version="1.0"?>
<valid attribute='"'/>

注释

所有五个特殊字符均不得在注释中转义:

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>

数据

所有五个特殊字符都不能CDATA部分中转义:

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>

加工说明

XML处理指令中不得对所有五个特殊字符进行转义:

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>

XML与HTML

HTML有其自己的转义码集,可覆盖更多字符。


33
@Pacerier,请您不要编写自己的XML / HTML转义代码。使用库函数,否则您肯定会错过特殊情况。
杰森

5
另外,对于换行符,您需要使用&#xA; &#xD; 和&#x9; 标签,如果您需要在属性中使用这些字符。
radistao 2012年

78
如果您要对这些内容进行查找/替换,只需记住要执行&amp; 替代其他人。
Doug

2
@Doug我正要提一提完全相同的内容-否则所有其他替换的字符将被破坏,并且类似的内容&quot;将更改为&amp;quot;
Jerry Dodge

5
从Wikipedia:“所有允许的Unicode字符都可以用数字字符引用表示。” 所以,有很多超过5
蒂姆·库珀

93

也许这会有所帮助:

XML和HTML字符实体引用列表

在SGML,HTML和XML文档中,称为字符数据和属性值的逻辑结构由字符序列组成,其中每个字符都可以直接表示(代表自己),也可以由一系列称为字符引用的字符表示,其中有两种类型:数字字符引用和字符实体引用。本文列出了在HTML和XML文档中有效的字符实体引用。

该文章列出了以下五个预定义的XML实体:

quot  "
amp   &
apos  '
lt    <
gt    >

73

根据万维网联盟(w3C)的规范,除了用作标记定界符或用作注释定界符或在注释,处理指令或CDATA部分中使用之外,XML文档中不得有5个字符以其原义形式出现。。在所有其他情况下,必须根据下表使用相应的实体或数字引用来替换这些字符:

Original CharacterXML entity replacementXML numeric replacement
<                              &lt;                                    &#60;                                    
>                              &gt;                                   &#62;                                    
"                               &quot;                               &#34;                                    
&                              &amp;                               &#38;                                    
'                               &apos;                               &#39;                                    

注意,上述实体也可以在HTML中使用,除了’。,它是随XHTML 1.0一起引入的,而未在HTML 4中声明。因此,为了确保兼容性,XHTML规范建议使用&#39;。代替。


14
XML预定义了这五个实体,但绝对没有指定您不能以其字面形式使用这五个字符中的任何一个。<和&必须在任何地方转义(CDATA除外)。“和”仅在属性值进行转义,且仅当相应的引号字符相同且>从来没有真正来转义。
肖恩麦坎斯

3
如上所述,<>“&'用作标记定界符时或在注释,处理指令或CDATA节中不必转义。即,当您将<>用作XML标记时,请不要转义一个评论。同样的事情(你会逃脱与在XML文件中的注释行吗?你不需要,如果你不这样做你的XML仍然有效),这是在明确规定的官方建议XML由W3C
Albz

7
>如果@ShaunMcCance ]]在内容中紧随其后,则必须转义,除非打算将其作为]]>指示CDATA节结尾的定界符的一部分。
Lee D

2
@Albz并不是死灵法师,而是说必须在内容中体现这些字符是不正确的。请参阅w3.org/TR/REC-xml/#NT-CharData中的 2.4节。TL; DR版本是chardata元素内容中的版本;和&lt; 必须始终被吸引。&gt; 字符可以被加密,尽管它必须出现在文字字符串“]]>”中,因为否则将被读为CDATA节的结尾。对于单引号和双引号,可以根据需要进行转义。就是这样,用于元素内部的chardata。XML的其他组件具有其他规则。
斯凯-机长

52

标签和属性的转义字符不同。

对于标签:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;

对于属性:

" &quot;
' &apos;

角色数据和标记

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

为了允许属性值同时包含单引号和双引号,撇号或单引号字符(')可以表示为“’”,而双引号字符(”)可以表示为“’”。”。


这意味着对于属性,只需要对引号进行转义,但这是对其他三个字符的
补充-ug

40

对旧的常见问题的新的简化答案...

简化的XML转义(优先级为100%完成)

  1. 始终 (记住90%的重要性)

    • 逃生<&lt;,除非<正在启动<tag/>
    • 逸出&&amp;除非&正在启动的&entity;
  2. 属性值 (9%要记住)

    • attr=" '单引号'是双引号内确定。"
    • attr=' "双引号"是单引号内确定。'
    • 逃生"&quot;'&apos;其他。
  3. 注释CDATA处理说明 (记住0.9%很重要)

    • <!--注释中, -->没有任何内容必须转义,但不允许使用--字符串。
    • <![CDATA[CDATA中, ]]>没有任何内容必须转义,但是]]>不允许使用任何字符串。
    • <?PITargetPI中, ?>没有任何内容必须转义,但?>不允许使用任何字符串。
  4. 埃索特里卡 (0.1%重要记住)

    • 逃生]]>]]&gt;,除非]]>是结束CDATA节。
      (此规则通常适用于字符数据,即使在CDATA部分之外也是如此。)

另一个值得注意的规则:即使不在CDATA节中,也]]>必须以进行转义]]&gt;。实现这个的最简单的方法可能是永远逃脱>&gt;
迈克尔·凯

谢谢,@ MichaelKay。我已将您的有用说明纳入其中,]]> 但选择将其委托给esoterica,而不是建议> 始终将其转义(如您所知,它不一定要转义)。我的目标是使XML转义规则易于记忆 并且 100%准确
kjhughes

上面的答案(包括已接受的提及一提到所有五个字符)应在属性内转义。您是否有参考XML标准来支持您所说的内容,因为从逻辑上看您的答案是正确的?
罗曼·苏西

1
@RomanSusi:是的,基于官方XML BNF的传闻,误解或误解,许多其他答案都包含错误或过于笼统(“安全方式...”)。我的答案是(a)W3C XML Recommendation 100%合理;请参阅有关官方BNF的许多链接参考,以及(b)以简洁,合乎逻辑且易于记忆的方式对这些要求进行组织。
kjhughes

@RomanSusi:具体的声明说:“所有5个字符应中的属性进行转义”是由官方BNF规则不支持的马虎指导AttValue通过一个链接引用我的回答2. 属性值
kjhughes

25

除了众所周知的五个字符[<,>,&,“和'],我还将转义垂直制表符(0x0B),它是有效的UTF-8,但不是有效的XML 1.0,甚至很多库(包括高度可移植的(ANSI C)库libxml2)将其遗漏,并以静默方式输出无效的XML。


11

摘自:XML,转义

有五个预定义的实体:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "

“所有允许的Unicode字符都可以用数字字符引用表示。” 例如:

&#20013;

大多数控制字符和其他Unicode范围都被明确排除,这意味着(我认为)它们既不能转义也不能直接出现:

XML中的有效字符


3

这取决于上下文。对于内容,它是<以及]]>(尽管是三个字符串而不是一个字符)。

对于属性值,它是<'

对于CDATA,它是]]>


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.