在 XML 文档中必须对哪些字符进行转义,或者我在哪里可以找到这样的列表?
10 回答
如果您使用适当的类或库,他们会为您进行转义。许多 XML 问题是由字符串连接引起的。
XML 转义字符
只有五个:
" "
' '
< <
> >
& &
转义字符取决于使用特殊字符的位置。
这些示例可以在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 有自己的一套转义码,涵盖了更多的字符。
也许这会有所帮助:
在 SGML、HTML 和 XML 文档中,称为字符数据和属性值的逻辑结构由字符序列组成,其中每个字符可以直接显示(表示它自己),也可以由称为字符引用的一系列字符表示,其中有两种类型:数字字符引用和字符实体引用。本文列出了在 HTML 和 XML 文档中有效的字符实体引用。
那篇文章列出了以下五个预定义的 XML 实体:
quot "
amp &
apos '
lt <
gt >
根据万维网联盟 (w3C) 的规范,有 5 个字符不得以其文字形式出现在 XML 文档中,除非用作标记分隔符或在注释、处理指令或 CDATA 部分中. 在所有其他情况下,必须根据下表使用相应的实体或数字引用替换这些字符:
Original CharacterXML entity replacementXML numeric replacement
< < <
> > >
" " "
& & &
' ' '
请注意,上述实体也可以在 HTML 中使用,除了&’; ,它是在 XHTML 1.0 中引入的,在 HTML 4 中没有声明。出于这个原因,为了确保追溯兼容性,XHTML 规范建议使用 ' 反而。
标签和属性的转义字符是不同的。
对于标签:
< <
> > (only for compatibility, read below)
& &
对于属性:
" "
' '
从字符数据和标记:
& 符号 (&) 和左尖括号 (<) 不得以其文字形式出现,除非用作标记分隔符,或者在注释、处理指令或 CDATA 部分中。如果在其他地方需要它们,则必须分别使用数字字符引用或字符串“&”和“<”对它们进行转义。右尖括号 (>) 可以使用字符串“>”表示,并且为了兼容性,必须使用“>”或出现在内容中的字符串“]]>”中的字符引用进行转义,当该字符串未标记 CDATA 部分的结尾时。
为了允许属性值同时包含单引号和双引号,撇号或单引号字符 (') 可以表示为“'”,而双引号字符 (") 可以表示为“"”。”。
除了常见的五个字符[<、>、&、"、']之外,我还会转义垂直制表符(0x0B)。它是有效的UTF-8,但不是有效的XML 1.0,甚至很多库(包括高度可移植的 (ANSI C) 库libxml2)错过它并默默地输出无效的 XML。
摘自:XML、转义
有五个预定义的实体:
< represents "<"
> represents ">"
& represents "&"
' represents '
" represents "
“所有允许的 Unicode 字符都可以用数字字符引用表示。” 例如:
中
大多数控制字符和其他 Unicode 范围都被特别排除在外,这意味着(我认为)它们既不能转义也不能直接出现:
这取决于上下文。对于内容,它是<和&和]]>(虽然是三个而不是一个字符的字符串)。
对于属性值,它是<、&、"和'。
对于 CDATA,它是]]>。
接受的答案不正确。最好是使用一个库来转义 xml。
正如在另一个问题中提到的
“基本上,控制字符和超出 Unicode 范围的字符是不允许的。这也意味着调用例如字符实体是被禁止的。”
如果你只转义五个字符。您可能会遇到诸如发现无效 XML 字符 (Unicode: 0xc) 之类的问题
仅当它们被处理字符数据<
而&
不是标记时才需要转义: