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

Jul*_*s A 889 xml escaping character

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

Wel*_*bog 1303

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

XML转义字符

只有五个:

"   "
'   '
<   &lt;
>   &gt;
&   &amp;
Run Code Online (Sandbox Code Playgroud)

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

可以在W3C标记验证服务中验证这些示例.

文本

在安全的方式是逃避文本所有5个字符,然而,三个字符",'>无需在文本转义:

<?xml version="1.0"?>
<valid>"'></valid>
Run Code Online (Sandbox Code Playgroud)

属性

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

<?xml version="1.0"?>
<valid attribute=">"/>
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0"?>
<valid attribute="'"/>
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0"?>
<valid attribute='"'/>
Run Code Online (Sandbox Code Playgroud)

评论

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

<?xml version="1.0"?>
<valid>
<!-- "'<>& -->
</valid>
Run Code Online (Sandbox Code Playgroud)

CDATA

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

<?xml version="1.0"?>
<valid>
<![CDATA["'<>&]]>
</valid>
Run Code Online (Sandbox Code Playgroud)

处理说明

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

<?xml version="1.0"?>
<?process <"'&> ?>
<valid/>
Run Code Online (Sandbox Code Playgroud)

XML与HTML

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

  • 如果您要对这些进行查找/替换,请记住执行&amp; 在其他人之前更换. (76认同)
  • @Pacerier,求求你不要编写自己的XML/HTML转义代码.使用库函数或者你一定会错过一个特例. (31认同)
  • 对于换行符,您需要使用&#xA; &#的xD; 和&#x9; 对于选项卡,如果您在属性中需要这些字符. (5认同)
  • 来自维基百科:"所有允许的Unicode字符都可以用数字字符引用表示." 所以有超过5个. (5认同)
  • @Doug我只是要提到完全相同的东西 - 否则所有其他被替换的字符都将被破坏,像````这样的东西将被改为`&amp; quot;` (2认同)
  • 您*可以*转义任何您想要的字符——甚至*每个*字符。如果您尝试将任意字符串转换为 XML 内容(也就是说,您不希望在其中检测到任何标签或其他 XML 结构),那么只有小于号、与号和序列“]]&gt;”实际上很重要)。“]]&gt;”不常见,所以有些人会忽略它;或者您可以将其中的“&gt;”更改为&gt; 或&gt; 或 &gt; (2认同)

And*_*are 90

也许这会有所帮助:

XML和HTML字符实体引用列表:

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

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

quot  "
amp   &
apos  '
lt    <
gt    >
Run Code Online (Sandbox Code Playgroud)


Alb*_*lbz 71

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

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

注意,上述实体也可以在HTML中使用,除了' ,这是在XHTML 1.0中引入的,并未在HTML 4中声明.出于这个原因,为了确保复古兼容性,XHTML规范建议使用' 代替.

  • XML预定义了这五个实体,但它绝对不指定您不能以其文字形式使用这五个字符中的任何一个.<和&必须在任何地方进行转义(CDATA除外)."和'只需要在属性值中进行转义,并且只有在相应的引号字符相同的情况下才会转义.并且>实际上永远不必转义. (13认同)
  • @ShaunMcCance`>`必须在内容中跟随`]]`进行转义,除非它打算成为表示CDATA部分结尾的`]]>`分隔符的一部分. (6认同)
  • 如上所述,当用作标记分隔符或在注释,处理指令或CDATA部分中时,<>"&"不必被转义.即,当您使用<>作为XML标记时,您不会逃避它同样的评论(你会在XML文件的注释行中转义吗?你不需要,如果你不这样做,你的XML仍然有效.)[官方建议中明确规定了这一点. for W3C的XML](http://www.w3.org/TR/xml11/#dt-chardata). (2认同)
  • 不是死灵法师,但@Albz 说这些角色必须在内容中实体化是不正确的。请参阅 https://www.w3.org/TR/REC-xml/#NT-CharData 上的第 2.4 节。TL; DR 版本是在 chardata 元素内容中,&amp; 并且<必须始终被实体化。&gt; 字符可以实体化,尽管它必须出现在文字字符串“]]&gt;”中,否则将被读取为 CDATA 部分的结尾。对于单引号和双引号,您可以根据需要进行转义。就是这样,对于元素内的 chardata。XML 的其他组件有其他规则。 (2认同)

Pet*_*els 49

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

对于标签:

 < &lt;
 > &gt; (only for compatibility, read below)
 & &amp;
Run Code Online (Sandbox Code Playgroud)

对于属性:

" &quot;
' &apos;
Run Code Online (Sandbox Code Playgroud)

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

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

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


kjh*_*hes 27

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

简化的XML转义

  1. 永远 (记住90%很重要)

    • 逃避<,&lt;除非<是开始<tag/>.
    • 逃避&,&amp;除非&是开始&entity;.
  2. 属性值 (9%重要值得记住)

    • attr=" '单引号'在双引号内是可以的."
    • attr=' "双引号"在单引号内是可以的.'
    • 逃生"&quot;'&apos;其他.
  3. 评论,CDATA处理说明 (重要的是要记住0.9%)

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

    • 逃生]]>]]&gt;,除非]]>是结束CDATA节.
      (此规则通常适用于字符数据 - 甚至在CDATA部分之外.)

  • 另一条值得注意的规则是:“]]&gt;”必须转义为“]]&gt;”,即使不在 CDATA 部分中也是如此。实现这一目标的最简单方法可能是“始终”将“&gt;”转义为“&gt;”。 (3认同)
  • @RomanSusi:是的,许多其他答案包含基于道听途说、误解或对官方 XML BNF 的误解的错误或过度概括(“安全方法...”)。我的答案是 (a) W3C XML 推荐标准 100% 合理;查看官方 BNF 的许多链接引用,以及 (b) 以简洁、逻辑且易于记忆的顺序组织这些要求。 (3认同)

Cha*_* ME 23

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


Tim*_*per 7

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

有五个预定义的实体:

&lt; represents "<"
&gt; represents ">"
&amp; represents "&"
&apos; represents '
&quot; represents "
Run Code Online (Sandbox Code Playgroud)

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

&#20013;
Run Code Online (Sandbox Code Playgroud)

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

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


Gab*_*eim 6

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

正如另一个问题中提到的

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

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