XML文档在数据存储和跨平台交换中应用广泛,其语法对字符的使用有明确规定,不符合规则的字符会导致文档解析失败,因此了解XML字符的相关规则是开发中的必备技能。
XML中的特殊保留字符
XML语法本身定义了一些具有特殊功能的字符,这些字符不能直接作为普通文本内容出现在XML的元素值或属性值中,否则会破坏文档的结构。常见的特殊保留字符如下:
| 字符 | 含义 | 使用限制 |
|---|---|---|
| < | 标签开始符号 | 不能直接作为文本出现,否则解析器会误认为是标签起始 |
| > | 标签结束符号 | 不能直接作为文本出现,否则解析器会误认为是标签结束 |
| & | 实体引用起始符号 | 不能直接作为文本出现,否则解析器会误认为是实体引用开始 |
| " | 属性值引号 | 属性值中不能直接出现,否则会提前结束属性值定义 |
| ' | 属性值引号 | 属性值中不能直接出现,否则会提前结束属性值定义 |
XML字符转义方法
如果需要在XML文档中展示上述特殊字符的文本内容,必须使用预定义的实体引用来替代,对应的转义规则如下:
- < 转义为 <
- > 转义为 >
- & 转义为 &
- " 转义为 "
- ' 转义为 '
以下是一个包含转义字符的XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<title>XML字符说明</title>
<content>当文本中包含 <div> 标签时,需要转义为 &lt;div&gt;</content>
<attr_test name="包含"引号"的属性值"/>
</note>
CDATA区块的使用
当需要插入大量包含特殊字符的文本时,逐个转义会非常繁琐,此时可以使用CDATA区块。CDATA区块中的内容会被解析器当作纯文本处理,不会解析其中的任何XML特殊字符。CDATA的语法格式为:
<![CDATA[ 需要包含的文本内容 ]]>
注意CDATA的结束标志是]]>,因此文本内容中不能包含连续的]]字符,否则会导致区块提前结束。以下是一个CDATA的使用示例:
<?xml version="1.0" encoding="UTF-8"?>
<article>
<content>
<![CDATA[
这是一段包含大量特殊字符的文本:
测试内容
a & b = c
属性值:"name"='test'
]]>
</content>
</article>
XML字符编码要求
XML文档需要在头部声明字符编码,确保解析器能正确识别文档中的字符。常见的编码格式有UTF-8、UTF-16、ISO-8859-1等,其中UTF-8是推荐使用格式,因为它支持所有Unicode字符,兼容性最好。编码声明格式如下:
<?xml version="1.0" encoding="UTF-8"?>
如果文档中包含了编码声明不支持的字符,会导致解析错误,因此编写XML时应尽量使用UTF-8编码,避免出现乱码问题。
常见错误示例
以下是几个不符合XML字符规则的常见错误写法:
<!-- 错误1:属性值中包含未转义的双引号 --> <user info="姓名"张三""/> <!-- 错误2:文本内容中包含未转义的&符号 --> <math>1 & 2 = 3</math> <!-- 错误3:CDATA中包含]]导致提前结束 --> <content><![CDATA[测试]]内容]]></content>
正确的修正写法如下:
<!-- 修正1:转义双引号 --> <user info="姓名"张三""/> <!-- 修正2:转义&符号 --> <math>1 & 2 = 3</math> <!-- 修正3:拆分]]或者转义内容 --> <content><![CDATA[测试]]>内容]]></content>