XML 实体引用是用于转义特殊字符的语法机制,区别在于它告诉解析器“这是字面字符而非语法标记”;XML 仅预定义 5 个实体(&、<、>、”、’),未声明的自定义实体会导致解析错误。

XML 实体引用是啥,跟普通字符有啥区别
XML 里不能随便写 &、、<code>> 这些符号,因为它们有语法含义。实体引用就是一种“转义写法”,让解析器知道:“这不是语法标记,就是字面意思的字符”。比如 < 表示小于号本身,不是标签开始。
它不是编码(比如 UTF-8),也不是 HTML 里的 那种可选美化手段——在 XML 里,该用实体的地方不用,文档直接算格式错误,解析器会报错停住。
XML 预定义实体只有 5 个,别瞎造
XML 标准只承认这 5 个内置实体:&、<、>、"、'。没有 ©,没有 ,也没有 ©(数值字符引用另说,但那是另一套机制)。自己加一个 &foo;,又没在 DTD 或 schema 里声明,解析器不认识,直接报 Entity'foo' not defined。
常见错误现象:
- 把 HTML 习惯带进 XML:在 XML 文件里写
,结果解析失败 - 用编辑器自动替换把
&换成&,但漏了其他符号,导致还在裸奔 - 以为
'在所有环境都安全——其实老版本 IE 的 XML 解析器不支持它
什么时候必须用,什么时候可以不用
核心判断依据是:这个字符是否出现在 XML 的结构位置上。比如在元素内容里写 price < 100,这里的 < 是数据本意,必须转义;但如果它在属性值外、且不在标签边界上(比如注释里),其实也可以不转——但不推荐,容易误判。
更稳妥的做法:
- 所有出现在元素文本内容或属性值中的
&、、<code>>,一律转义 -
"和'只在对应属性定界符内需要转义(比如name="O'Reilly") - 如果内容来自用户输入或外部系统,别手动拼接,用库生成(如 Python 的
xml.etree.ElementTree自动处理)
数值字符引用和实体引用混用要注意什么
XML 允许用 (十进制)或 <code>(十六进制)表示字符,这叫数值字符引用,它不依赖 DTD 声明,比自定义实体可靠得多。但注意:<code> 是非法的(空字符),多数解析器会拒掉整个文档; (回车)和 (换行)虽然合法,但在某些解析场景下会被规范化成统一换行符,影响原始格式。
容易被忽略的一点:UTF-8 编码的 XML 文件里,只要声明了 <?xml version="1.0" encoding="UTF-8"?>,大部分常用字符(比如中文、emoji)完全可以原样写,不用实体也不用数值引用——实体不是万能解药,只是结构冲突时的必要妥协。