XML Vocabulary 可以理解为某个特定领域内 XML 文档的结构定义,它规定了一份 XML 文件中可以出现哪些元素、这些元素可以携带哪些属性、元素之间如何嵌套以及文本内容的类型是什么。与自然语言中的词汇表类似,发音、词性和用法规则共同决定了一个词能否被正确使用。在 XML 生态中,词汇表就是判定一份 XML 文档是否合法的依据。

一、XML Vocabulary 的本质:结构与语义的约束规则
XML 本身只提供了一种描述树状数据的语法,它并没有规定某个元素必须叫什么名字,也没有规定 <book> 元素下面必须出现 <title> 还是 <author>。XML Vocabulary 的作用正是填补这一空白。它用一套明确的规则告诉解析器和数据交换双方:在这种文档中,根元素是什么,哪些子元素是允许的,属性是否必须存在,元素内容可以包含文本还是只能包含其他元素。
一个 XML 文档如果符合基础 XML 语法,称为格式良好(well-formed);如果同时还满足某个 Vocabulary 定义的约束,则称为有效(valid)。有效性验证是 XML 在跨系统数据交换中保持稳定运行的关键,因为接收方可以预先根据 Vocabulary 检查传入数据是否缺失关键字段、是否包含未知标签,从而避免程序在运行时因意外结构而崩溃。
值得注意的是,XML Vocabulary 并不是将自然语言的词汇直接照搬,而是针对机器可读数据设计的一套符号系统。不同行业可以定义完全不同的词表来表示相同或相近的概念,例如图书行业可能使用 <book>,而物流行业则可能使用 <package>。命名空间机制进一步增强了词汇表的可组合性,让不同领域的元素可以同时出现在一份文档中而不发生名称冲突。
二、主流定义方式:DTD 与 XML Schema 对比
定义 XML Vocabulary 最常见的方式有两种:文档类型定义(DTD)和 XML Schema(XSD)。DTD 出现较早,语法相对简洁,适合描述元素顺序、出现次数以及基本的属性类型。它的主要缺点是不支持命名空间,数据类型表达能力有限,只能通过一些内置关键字如 CDATA 和 ID 描述字符串和标识符。
下面是一个典型的 DTD 文件,它为一个简单图书词汇表设定了结构约束:
<!ELEMENT bookstore (book+)> <!ELEMENT book (title, author, year, price)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST book category CDATA #REQUIRED>
相比之下,XML Schema 使用 XML 语法自身来定义词汇表,功能更加强大。它支持丰富的数据类型,如 integer、date 和 decimal,并且能够结合命名空间来精确限定元素和属性的来源。这意味着你可以在一份 Schema 中同时约束两个不同命名空间的元素,而 DTD 很难做到这一点。
XML Schema 还支持复杂类型、继承和扩展机制,这使得词汇表的设计可以像面向对象编程一样进行复用。例如先定义一个通用的 productType,再通过扩展得到 bookType 和 electronicsType,既减少了重复定义,又保持了结构一致性。因此在新项目中,除非需要兼容非常老旧的系统,一般推荐优先使用 XSD 来定义 XML Vocabulary。
三、常见 XML Vocabulary 与自定义实践
在实际开发中接触到的许多格式都属于 XML Vocabulary。XHTML 是 HTML 的 XML 化版本,它要求所有标签必须闭合、属性值必须加引号、元素和属性名使用小写。SVG 是一种用于描述二维矢量图形的词汇表,MathML 则专门用来表示数学公式。这些词汇表都通过各自的命名空间进行区分,例如 SVG 的命名空间 URI 为 http://www.w3.org/2000/svg。需要注意的是,命名空间 URI 只是一个标识符,并不要求能访问到真实资源。
下面展示一个同时使用 XHTML 和 SVG 词汇表的 XML 文档片段,它利用命名空间避免两个词汇表中的同名元素冲突:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>这是一个矢量图形示例</p>
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100">
<circle cx="50" cy="50" r="40" fill="red" />
</svg>
</body>
</html>
当需要设计自定义 XML Vocabulary 时,首先应当明确数据交换的业务模型,梳理出核心实体和它们之间的关系。接着为这些实体选择清晰、无歧义的元素名,并规划好可选的属性和必需的属性。例如一个简单的订单词汇表可以包含 <order> 根元素,下面有 <customer>、<items> 和 <total> 子元素。然后通过 XSD 定义每个元素的数据类型和出现次数。
以下是一个订单词汇表的 XSD 定义片段,它约束了 <order> 的结构和数据类型:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element name="customer" type="xs:string" />
<xs:element name="items">
<xs:complexType>
<xs:sequence>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="productId" type="xs:string" />
<xs:element name="quantity" type="xs:positiveInteger" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total" type="xs:decimal" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
完成 XSD 后,所有参与数据交换的系统都可以使用支持 XML Schema 的解析器对输入文档进行校验。这样可以尽早拦截结构错误,减少接口联调阶段的沟通成本。同时,在 XML Vocabulary 设计过程中预留扩展点也很重要,例如利用 <xs:any> 或通配符,让词汇表在未来能够平滑引入新元素而不破坏现有文档的有效性。
XML VocabularyXML Schema命名空间修改时间:2026-08-26 00:35:27