1027

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

4

10 回答 10

1503

如果您使用适当的类或库,他们会为您进行转义。许多 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 有自己的一套转义码,涵盖了更多的字符。

于 2009-07-07T12:09:31.850 回答
96

也许这会有所帮助:

XML 和 HTML 字符实体引用列表

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

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

quot  "
amp   &
apos  '
lt    <
gt    >
于 2009-07-07T12:09:50.803 回答
80

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

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

请注意,上述实体也可以在 HTML 中使用,除了&’; ,它是在 XHTML 1.0 中引入的,在 HTML 4 中没有声明。出于这个原因,为了确保追溯兼容性,XHTML 规范建议使用 ' 反而。

于 2013-07-03T12:38:30.517 回答
63

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

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

  1. 总是 (90% 重要的是要记住)

    • 除非开始一个或其他标记<,否则转义。&lt;<<tag/>
    • 除非正在启动一个&.&amp;&&entity;
  2. 属性值 (9% 需要记住)

    • attr=" '单引号'在双引号内是可以的。"
    • attr=' "双引号"可以在单引号内。'
    • "&quot;其他'方式逃脱&apos;
  3. 评论CDATA处理指令 (需要记住 0.9%)

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

于 2017-10-09T01:54:52.917 回答
54

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

对于标签:

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

对于属性:

" &quot;
' &apos;

字符数据和标记

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

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

于 2014-02-05T10:03:09.247 回答
27

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

于 2012-04-25T13:38:03.043 回答
14

摘自:XML、转义

有五个预定义的实体:

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

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

&#20013;

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

XML 中的有效字符

于 2014-08-15T07:53:58.817 回答
4

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

对于属性值,它是<&"'

对于 CDATA,它是]]>

于 2015-06-04T14:36:52.250 回答
4

接受的答案不正确。最好是使用一个库来转义 xml。

正如在另一个问题中提到的

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

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

于 2021-01-29T14:35:58.167 回答
-9

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

2.4 字符数据和标记

于 2014-04-02T14:17:38.963 回答