XML基础及特殊字符转义 - 3

1,476 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

XML中预定义特殊字符及其使用规则

XML的标准解析库会自动地将XML文件中的特殊字符进行转义, 这里是要记录一下这些特殊字符在XML不同概念中的转义规则. 大量的XML问题是在字符串的使用当中由特殊字符引起的.

XML特殊字符

XML中预定义了5种特殊字符:

原始符号XML实体转义XML数字转义名称
<&lt;&#60;小于号
>&gt;&#62;大于号
"&quot;&#34;双引号
&&amp;&apos;
'&apos;&#39;单引号

特殊字符是否需要转义依赖于它使用的位置.

示例进行验证的官方地址为W3C标记认证服务.

文本

特殊字符在文本中使用时, 最安全的方式是全部都转义. 但是, "'>这3个字符在文本中不转义也可以:

<?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 vs. HTML

HTML有自己的特殊编码集, 覆盖了更多字符.

最简XML转义  (按重要性排列过, 完成度100%)

  1. 绝对转义  (记忆重要性: 90%)

    • <转义为&lt;, 除非<<tag/>或其它标记的起始字符.
    • &转义为&amp;, 除非&&entity;的起始字符.
  2. 属性值  (记忆重要性: 9%)

    • attr="在双引号中'单引号'是可以使用的."
    • attr='在单引号中"双引号"是可以使用的.'
    • 除上述两种情况外, 需要要将"转义为&quot;, '转义为&apos;.
  3. 注释CDATA, 和处理指令  (记忆重要性: 0.9%)

    • <!-- 在注释内部 -->, 什么都不需要转义, 但是, 字符串--不可以使用.
    • <![CDATA[ 在CDATA内部 ]]>, 什么都不需要转义, 但是, 字符串]]>不可以使用.
    • <?PITarget 在PI内部 ?>, 什么都不需要转义, 但是, 字符串?>不可以使用.
  4. 秘籍  (记忆重要性: 0.1%)