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

评论


请参阅下面的“简化的XML转义”以获取我从主要资源(W3C可扩展标记语言(XML)1.0(第五版))中摘录的简明易记的指南。

#1 楼

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

XML转义字符

只有五个:

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


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

可以在W3C标记验证服务中验证示例。

文本

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

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


属性

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

如果引号是',则不必在属性中转义"字符:

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


同样,如果引号是",则不必在属性中对'进行转义:
/>
所有五个特殊字符都不能在注释中转义:

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


CDATA

所有五个特殊字符都不得在CDATA节中转义:

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


处理指令

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

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


XML与HTML的对比

评论


@Pacerier,请您不要编写自己的XML / HTML转义代码。使用库函数,否则您肯定会错过特殊情况。

–詹森
2012年3月16日在9:23




从Wikipedia:“所有允许的Unicode字符都可以用数字字符引用表示。”因此,不止5个。

–蒂姆·库珀(Tim Cooper)
2014年8月15日在7:47

#2 楼

也许这会有所帮助:

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


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


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

quot  "
amp   &
apos  '
lt    <
gt    >


#3 楼


评论


XML预定义了这五个实体,但绝对没有指定您不能以其字面形式使用这五个字符中的任何一个。 <和&必须在任何地方转义(CDATA除外)。 “和”仅需在属性值中进行转义,并且仅在相应的引号字符相同的情况下才可以进行转义。“>”实际上不必进行转义。

– Shaun McCance
13年8月24日在13:58

如上所述,<>“&'用作标记定界符时或在注释,处理指令或CDATA节中不必转义。即,当您将<>用作XML标记时,请不要转义。注释也是如此(您是否会在XML文件的注释行中转义&?您不需要,如果不是,则XML仍然有效)。 W3C提供的XML。

– Albz
13年10月1日在7:21

如果@ShaunMcCance>在内容中位于]]之后,则必须转义,除非打算将其作为[]]>分隔符的一部分,以指示CDATA节的结尾。

–李D
2014-4-25 17:45




#4 楼


评论


这意味着对于属性,仅需对引号进行转义,但这是对其他三个字符的补充

–ug
18年7月5日在4:46

#5 楼

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

简化的XML转义(优先级为100%完整)





(始终要记住90%的重要性)


除非将<启动为&lt;,否则将<换为<tag/>。 />


属性值(9%要记住)




& &amp;单引号&可以放在双引号内。 &entity;


attr=" '双引号'可以在单引号内使用。 "

否则将attr='替换为",将"替换为'




注释,CDATA和处理指令(要记住0.9%重要)



"在注释&quot;中,没有必须转义的内容,但不允许'字符串。

&apos;在CDATA中<!--不需要进行任何转义,但不允许使用-->字符串。

--在PI <![CDATA[内无需进行任何转义,但不允许]]>字符串。



Esoterica(要记住0.1%重要)


]]>换成<?PITarget,除非?>结束了CDATA部分。 (此规则通常适用于字符数据-即使在CDATA部分之外。)





评论



谢谢,@ MichaelKay。我已将您对[]]>的有用注释并入其中,但选择将其授权给esoterica,而不是建议始终>>逃脱(您不必知道)。我的目标是使XML转义规则易于记忆并且100%准确。

–kjhughes
18年6月3日在14:01

上面的答案(包括接受的提及一提到所有五个字符)应在属性内转义。您是否参考XML标准来支持您所说的内容,因为从逻辑上看您的答案是正确的?

–罗马苏西
2月7日5:49

@RomanSusi:是的,基于官方XML BNF的传闻,误解或误解,许多其他答案都包含错误或过于笼统(“安全方式...”)。我的答案是(a)100%被W3C XML Recommendation证明是正确的;请参阅有关官方BNF的许多链接参考,以及(b)以简洁,合乎逻辑且易于记忆的方式对这些要求进行组织。

–kjhughes
2月7日13:44

@RomanSusi:“所有五个字符应在属性内转义”的具体说法是草率的指导,我的答案中通过2属性值链接引用了AttValue的官方BNF规则不支持。

–kjhughes
2月7日13:44



#6 楼

除了常见的五个字符[<,>,&,“和'],我还将转义垂直制表符(0x0B),它是有效的UTF-8,但不是有效的XML 1.0,甚至很多库(包括高度可移植的(ANSI C)库libxml2)会丢失它,并以静默方式输出无效的XML。

#7 楼

缩写自:XML,转义

有五个预定义的实体:

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


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

&#20013;


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

XML中的有效字符

#8 楼

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

对于属性值,它是<,&,“和'。

对于CDATA,它是]]>。

#9 楼

如果要将<&当作字符数据而不是标记,则只需要转义它们:

2.4字符数据和标记