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

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

1184920 次浏览

如果您使用适当的类或库,他们会为您执行转义。许多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与超文本标记语言

超文本标记语言有自己的一套转义码,它涵盖了更多的字符。

也许这将有助于:

XML和超文本标记语言字符实体引用列表

在SGML、超文本标记语言和XML文档中称为字符的逻辑结构数据和属性值由字符序列,其中每个角色可以直接显化(代表自己),或者可以是由一系列字符表示称为字符引用,其中有两种类型:数字字符引用和字符实体参考。本文列出字符实体引用在超文本标记语言和XML文档中有效。

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

quot  "amp   &apos  'lt    <gt    >

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

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

原始字符XML实体替换XML数字替换
<<<
>>>
"""
&&&
'''

请注意,上述实体也可以在超文本标记语言中使用,除了',它是在XHTML 1.0中引入的,并且没有在超文本标记语言4中声明。

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

对于标签:

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

对于属性:

" &quot;' &apos;

字符数据和标记

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

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

如果要处理字符数据而不是标记,则只需要转义<&

2.4字符数据和标记

摘自:XML,转义

有五个预定义的实体:

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

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

&#20013;

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

XML中的有效字符

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

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

对于CDATA,它是]]>

一个老问题的简单答案…

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

  1. <强>一直(记住90%很重要)

    • 除非<开始#3或其他标记,否则将<转义为&lt;
    • 除非&开始#3,否则将&作为&amp;转义。
  2. 属性值(记住9%很重要)

    • attr="'单引号'在双引号内可以。"
    • attr='"双引号"在单引号内可以。'
    • 逃逸"作为&quot;'作为&apos;否则。
  3. 注释CDATA和处理说明(记住0.9%重要)

    • <!--评论数-->中没有任何内容必须转义,但不允许--字符串。
    • <![CDATA[CDATA]]>中不需要转义任何内容,但不允许]]>字符串。
    • <?PITargetPI?>中不需要转义任何内容,但不允许?>字符串。
  4. Esoterica(0.1%重要要记住)

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

正如在这个其他问题中提到的

"基本上,不允许使用控制字符和Unicode范围以外的字符。这也意味着禁止调用字符实体等。"

如果您只转义五个字符。您可能会遇到找到无效的XML字符(Unicode: 0xc)这样的问题