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

What characters do I need to escape in XML documents?

提问人:Julius A 提问时间:7/7/2009 最后编辑:animusonJulius A 更新时间:12/4/2021 访问量:1275659

问:

XML 文档中必须转义哪些字符,或者在哪里可以找到这样的列表?

XML 转义 字符

评论

10赞 jacktrades 12/6/2012
例:<company>AT&amp;T</company>
1赞 kjhughes 2/15/2018
请参阅下面的简化 XML 转义,了解我从主要来源(W3C 可扩展标记语言 (XML) 1.0(第五版))中提炼出来的简明易记的指南。
1赞 Jason C 5/5/2021
从字面上看,这里没有一个答案是正确的。您还必须在 XML 1.1 中转义许多不同的控制字符。
1赞 kjhughes 12/4/2021
@JasonC:理想的做法是按预期而不是字面意思来理解问题。如果您觉得未来的读者会从如何在 XML 中指定控制字符的详细说明中受益,请在回答中详细说明。谢谢。
0赞 Jason C 12/4/2021
@kjhughes 由于问题被解释为预期,从字面上看,这里没有一个答案是正确的。您还必须对 XML 1.1 中的许多不同控制字符进行转义,如此处所述。另请参见 XML 1.1 §4.1、§4.4、§4.6Appx。C 了解具体细节和限制。

答:

1618赞 Welbog 7/7/2009 #1

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

XML 转义字符

只有五个:

"   &quot;
'   &apos;
<   &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的

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

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

加工说明

在 XML 处理指令中,所有五个特殊字符都不得转义:

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

XML 与 .HTML

HTML 有自己的一组转义码,涵盖了更多的字符。

评论

42赞 Jason 3/16/2012
@Pacerier,我恳求你不要编写自己的 XML/HTML 转义代码。使用库函数,否则您一定会错过特殊情况。
8赞 radistao 11/27/2012
此外,对于换行符,您需要使用 &#xA;&#xD;和 &#x9;对于选项卡,如果需要在属性中包含这些字符。
91赞 Doug 6/16/2013
如果您要对这些进行查找/替换,请记住执行 &在其他人之前更换。
2赞 Jerry Dodge 8/6/2013
@Doug我正要提到完全相同的事情 - 否则所有其他替换的字符都会被损坏,并且类似的东西将被更改为&quot;&amp;quot;
11赞 Tim Cooper 8/15/2014
来自维基百科:“所有允许的Unicode字符都可以用数字字符引用来表示。所以远不止 5 个。
98赞 Andrew Hare 7/7/2009 #2

也许这会有所帮助:

XML 和 HTML 字符实体引用列表

在 SGML、HTML 和 XML 文档中, 称为字符的逻辑结构 数据和属性值包括 字符序列,其中每个 字符可以直接显现 (表示自身),或者可以是 由一系列字符表示 称为字符引用,其中 有两种类型:数字 字符引用和字符 实体引用。本文列出了 字符实体引用 在 HTML 和 XML 文档中有效。

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

quot  "
amp   &
apos  '
lt    <
gt    >
29赞 Charon ME 4/25/2012 #3

除了通常的五个字符 [<、>、&、“ 和 '] 之外,我还会转义垂直制表符 (0x0B)。它是有效的 UTF-8,但不是有效的 XML 1.0,甚至许多库(包括高度可移植 (ANSI C) 库 libxml2)都错过了它并静默输出无效的 XML。

83赞 Albz 7/3/2013 #4

根据万维网联合会 (w3C) 的规范,XML 文档中不得以文字形式显示 5 个字符,除非用作标记分隔符或在注释、处理指令或 CDATA 节中。在所有其他情况下,必须使用相应的实体或下表中的数字引用替换这些字符:

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

请注意,上述实体也可以在 HTML 中使用,但 ' 除外,它是在 XHTML 1.0 中引入的,未在 HTML 4 中声明。出于这个原因,为了确保向后兼容性,XHTML 规范建议改用 '

评论

18赞 Shaun McCance 8/24/2013
XML 预定义了这五个实体,但它绝对没有指定您不能以文字形式使用这五个字符中的任何一个。< 和 & 必须在任何地方转义(CDATA 除外)。“和”只需要在属性值中转义,并且只有当相应的引号字符相同时。>实际上永远不必逃避。
3赞 Albz 10/1/2013
如上所述,< > “ & ' 用作标记分隔符或在注释、处理指令或 CDATA 部分中时,不必转义。也就是说,当您使用 < > 作为 XML 标记时,您不会转义它。注释也是如此(你会在XML文件的注释行中转义&吗?你不需要,如果你不需要,你的XML仍然有效)。这在 W3C 对 XML 的官方建议中明确规定。
7赞 Lee D 4/26/2014
如果@ShaunMcCance在内容中跟随,则必须对其进行转义,除非它打算成为指示 CDATA 部分末尾的分隔符的一部分。>]]]]>
3赞 chris 5/4/2016
不是要成为死灵法师,但@Albz说这些角色必须在内容上被授权是不正确的。见第2.4节 w3.org/TR/REC-xml/#NT-CharData。The TL;DR 版本是 chardata 元素内容中的版本,&和 <必须始终被实体化。的 >字符可以被实体化,但当它出现在文本字符串“]]>”中时必须被实体化,否则将被读取为结束 CDATA 部分。对于单引号和双引号,如果需要,可以转义。就是这样,对于元素内部的字符。XML 的其他组件具有其他规则。
54赞 Peter Bartels 2/5/2014 #5

对于标签和属性,转义字符是不同的。

对于标签:

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

对于属性:

" &quot;
' &apos;

字符数据和标记

与号字符 (&) 和左尖括号 (<) 不得 以文字形式显示,但用作标记分隔符时除外, 或在注释、处理指令或 CDATA 部分中。如果 在其他地方需要它们,它们必须使用任一数字进行转义 字符引用或字符串 “ & ” 和 “ < ” 分别。右尖括号 (&gt;) 可以使用 字符串 “ > ”,并且必须使用以下任一方式进行转义,以便兼容 “ > ” 或出现在字符串中时的字符引用 “ ]]> “,当该字符串未标记 CDATA 的末尾时 部分。

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

评论

1赞 eug 7/5/2018
这意味着对于属性,只需要转义引号,但这是对其他三个字符的补充
-9赞 Questionless 4/2/2014 #6

仅当它们被处理为字符数据而不是标记时,才需要转义:<&

2.4 字符数据和标记

14赞 Tim Cooper 8/15/2014 #7

节略自:XML、转义

有五个预定义的实体:

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

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

&#20013;

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

XML 中的有效字符

4赞 把友情留在无盐 6/4/2015 #8

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

对于属性值,它是 <&'

对于 CDATA,它是 ]]>

88赞 kjhughes 10/9/2017 #9

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

简化的 XML 转义(优先排序,100% 完成)

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

    • 转义,除非开始<标记/>或其他标记。<&lt;<
    • 转义,因为除非启动 &entity;&&amp;&
  2. 属性值(9% 重要要记住)

    • attr=" '单引号在双引号内是可以的。'"
    • attr=' "双引号在单引号内是可以的。"'
    • 以其他方式转义。"&quot;'&apos;
  3. 注释CDATA处理指令(需要记住 0.9% 的重要内容)

    • <!--评论中,任何内容都不必转义,但不允许使用任何字符串。-->--
    • <![CDATA[CDATA 中,无需转义任何内容,但不允许使用任何字符串。]]>]]>
    • <?PITargetPI 中,无需转义任何内容,但不允许使用任何字符串。?>?>
  4. 深奥(0.1%重要)

评论

2赞 Michael Kay 5/29/2018
另一个值得注意的规则:必须转义为 ,即使不在 CDATA 部分中也是如此。实现此目的的最简单方法可能是始终将 .]]>]]&gt;>&gt;
0赞 kjhughes 6/3/2018
谢谢,@MichaelKay。我已经纳入了你的有用说明,但选择将其降级为深奥,而不是建议总是逃避(如您所知,它不一定是)。我在这里的目标是使 XML 转义规则易于记忆 100% 准确]]>>
0赞 Roman Susi 2/7/2020
以上答案,包括接受的一句话,所有五个字符都应该在属性中转义。您是否对XML标准有任何参考来支持您所说的内容,因为您的答案在逻辑上似乎是正确的?
3赞 kjhughes 2/7/2020
@RomanSusi:是的,许多其他答案都包含基于道听途说、误解或对官方 XML BNF 的误解的错误或过度概括(“安全方式......”)。我的回答是 (a) W3C XML 推荐 100% 合理;请参阅对官方 BNF 的许多链接引用,以及 (b) 以简洁、合乎逻辑且易于记忆的这些要求的进展进行组织。
1赞 Felipe Valdes 11/18/2020
我想我应该把我未来的第一个孩子的名字从费利佩改为“;Felipe]]><PLAINTEXT> <!--,看看大多数网站会发生什么
6赞 Gabriel Furstenheim 1/29/2021 #10

公认的答案是不正确的。最好使用库来转义 xml。

正如另一个问题中提到的

“基本上,不允许使用控制字符和Unicode范围之外的字符。这也意味着,例如,调用字符实体是被禁止的。

如果你只转义这五个字符。您可能会遇到类似 发现无效的 XML 字符(Unicode:0xc)

评论

0赞 Salman Shaikh 5/3/2023
可以使用哪个库?
0赞 Gabriel Furstenheim 5/4/2023
每种语言都会有所不同。您可以在另一个 Stackoverflow 问题中查看 Java stackoverflow.com/a/439311