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

时间:2009-07-07 12:07:43

标签: xml escaping character

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

10 个答案:

答案 0 :(得分:1252)

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

XML转义字符

只有五个:

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

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

可以在W3C Markup Validation Service验证示例。

文本

安全的方法是转义文本中的所有五个字符,但是,"'>这三个字符无需在文本中转义:

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

属性

安全的方法是转义属性中的所有五个字符,但是,>字符不需要在属性中转义:

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

如果引号为',则"字符无需在属性中转义:

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

同样,如果引号为",则'无需在属性中进行转义:

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

评论

所有5个特殊字符不得在评论中转义:

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

CDATA

所有5个特殊字符不得CDATA个部分进行转义:

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

处理说明

所有5个特殊字符不得在XML处理说明中进行转义:

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

XML与HTML

HTML有its own set of escape codes,其中包含更多字符。

答案 1 :(得分:90)

也许这会有所帮助:

List of XML and HTML character entity references

  

在SGML,HTML和XML文档中   逻辑结构称为字符   数据和属性值由   字符序列,其中每个   角色可以直接表现出来   (代表自己),或者可以   由一系列人物代表   称为字符引用,其中   有两种类型:数字   字符引用和字符   实体参考。本文列出   字符实体引用它   在HTML和XML文档中有效。

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

quot  "
amp   &
apos  '
lt    <
gt    >

答案 2 :(得分:71)

根据万维网联盟(w3C)的规范there are 5 characters that must not appear in their literal form in an XML document,除非用作标记分隔符或注释,处理指令或CDATA部分。在所有其他情况下,必须使用相应的实体或根据下表的数字引用替换这些字符:

原始字符 XML实体替换 XML数字替换 < / KBD>
&LT; &安培; LT; &安培;#60;
&GT; &安培; GT; &安培;#62;
&amp; quot; &amp;#34;
&安培; &放大器;放大器; &安培;#38;
&安培;者; &安培;#39;

请注意,上述实体也可以在HTML中使用,但&amp; 除外,它是在XHTML 1.0中引入的,并未在HTML 4中声明。因此,和确保复古兼容性,the XHTML specification recommends the use of &#39;代替。

答案 3 :(得分:48)

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

对于标签:

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

对于属性:

" &quot;
' &apos;

http://www.w3.org/TR/2008/REC-xml-20081126/#syntax

  

&符号(&amp;)和左尖括号(&lt;)不得   以字面形式出现,除非用作标记分隔符,   或在评论,处理指令或CDATA部分内。如果   它们在别处需要,必须使用数字进行转义   字符引用或字符串“&amp; amp;”和“&amp; lt;”   分别。可以使用以下来表示右尖括号(&gt;)   字符串“&amp; gt;”,并且为了兼容性,必须使用其中任何一个进行转义   “&amp; gt;”或出现在字符串“]]&gt;中的字符引用   “在内容中,当该字符串未标记CDATA的结尾时   部分。

     

要允许属性值包含单引号和双引号,   撇号或单引号字符(')可以表示为“   &安培;者; “和双引号字符(”)为“&amp; quot;”。

答案 4 :(得分:21)

除了众所周知的五个字符[&lt;,&gt;,&amp;,“,']之外,我还会转义垂直制表符(0x0B)。它是有效的UTF-8,但不是有效的XML 1.0,甚至许多库(包括libxml2)都会错过它并静默输出无效的XML。

答案 5 :(得分:21)

对旧的,常见问题的简单回答...

简化的XML转义

  1. Always (要记住90%重要)

    • <转换为&lt;,除非<开始<tag/>
    • &转换为&amp;,除非&正在&entity;开始。
  2. Attribute Values (9%重要的是要记住)

    • attr=" '单引号'在双引号内可以。"
    • attr=' "双引号"在单引号内可以正常显示。'
    • "退出&quot;'退出&apos;
  3. CommentsCDATAProcessing Instructions (重要的是要记住0.9%)

    • <!--comments -->内,不需要转义任何内容,但不允许--个字符串。
    • <![CDATA[CDATA ]]>内,不得转义任何内容,但不允许]]>个字符串。
    • <?PITargetPIs ?>内,不得转义任何内容,但不允许?>个字符串。
  4. Esoterica (0.1%重要记住)

    • ]]>转义为]]&gt;,除非]]>结束CDATA部分。
      (此规则一般适用于字符数据 - 甚至在CDATA部分之外。)

答案 6 :(得分:6)

摘自:http://en.wikipedia.org/wiki/XML#Escaping

有五个预定义的实体:

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

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

&#20013;

大多数控制字符和其他unicode范围都被明确排除,这意味着(我认为)它们不会被转义或直接发生:

http://en.wikipedia.org/wiki/Valid_characters_in_XML

答案 7 :(得分:3)

这取决于具体情况。对于内容,它是&lt;和&amp;,和]]&gt;(虽然字符串为3而不是一个字符)。对于属性值,它是&lt;和&amp;和&#34;和&#39;。对于CDATA,它是]]&gt;。

答案 8 :(得分:1)

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

如本other question

中所述

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

如果只转义五个字符。您可能会遇到诸如 An invalid XML character (Unicode: 0xc) was found

之类的问题

答案 9 :(得分:-3)

仅<&lt;和&amp;如果要处理字符数据而不是标记,则需要进行转义:

http://www.w3.org/TR/xml11/#syntax