XML 验证是指使用特定的规则和工具检查 XML 文档是否符合预定义的结构、语法和约束。验证的目的是确保 XML 文档的格式是正确的,并且符合某些标准或规范,这些标准可以是 DTD(文档类型定义)、XML Schema 或 Relax NG 等。


1. XML 验证的目的

  • 语法验证:确保 XML 文档的语法正确,比如正确使用开始和结束标签、属性等。
  • 结构验证:确保 XML 文档的结构符合预定义的约束和规则。
  • 数据验证:确保文档中数据的格式或类型符合规定。

2. XML 验证的方式

XML 的验证主要通过两种方法来完成:

  1. 使用 DTD(文档类型定义):DTD 是定义 XML 文档合法结构和元素规则的标准。
  2. 使用 XML Schema:XML Schema 提供了一种比 DTD 更强大、更灵活的方式来定义 XML 文档的结构、数据类型和约束。

3. DTD(文档类型定义)验证

DTD 是一种描述 XML 文档结构的语言,定义了合法的元素、属性以及它们的顺序、出现次数等规则。DTD 可以在 XML 文档内部定义,也可以通过外部文件来定义。

3.1 内嵌 DTD

内嵌 DTD 是将 DTD 定义直接放入 XML 文件内部。通常放在文件的开头部分。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
    <!ELEMENT person (name, age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
]>
<person>
    <name>John Doe</name>
    <age>30</age>
</person>

  • 这个 DTD 定义了一个 person 元素,包含 name 和 age 两个子元素,且它们的内容为 PCDATA(可解析字符数据)。

3.2 外部 DTD

外部 DTD 是将 DTD 定义放在单独的文件中,然后通过 DOCTYPE 声明引用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "person.dtd">
<person>
    <name>John Doe</name>
    <age>30</age>
</person>

person.dtd 文件内容:

<!ELEMENT person (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

  • 通过引用外部 DTD 文件,XML 文档可以验证是否符合该 DTD 定义的结构。

4. XML Schema 验证

XML Schema 是一种比 DTD 更强大的 XML 结构描述语言。它不仅可以定义元素和属性的结构,还可以定义数据类型、数据范围、长度限制等复杂规则。

4.1 XML Schema 基本结构

XML Schema 文件使用 XSD(XML Schema Definition)语言编写,它的后缀通常是 .xsd。它允许对数据类型进行精确控制。

示例 person.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="person">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:int"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

在上面的示例中:

  • name 元素是字符串类型(xs:string)。
  • age 元素是整数类型(xs:int)。
  • 使用 xs:complexType 和 xs:sequence 定义了元素的顺序和结构。

4.2 XML 文档引用 XML Schema

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="person.xsd">
    <name>John Doe</name>
    <age>30</age>
</person>

在此示例中,XML 文档使用 xsi:noNamespaceSchemaLocation 属性引用了外部的 person.xsd Schema 文件,确保 XML 文档的内容符合 Schema 定义。

4.3 验证过程

XML Schema 验证过程包括:

  1. 结构验证:检查文档的元素和属性是否符合 Schema 定义的规则。
  2. 数据验证:确保数据类型(如 xs:stringxs:int)与实际内容匹配。
  3. 约束验证:检查元素的顺序、必填性、最小/最大出现次数等是否符合约束。

5. Relax NG 验证

Relax NG 是一种轻量级的 XML 模式定义语言,可以用于描述 XML 文档的结构。它与 XML Schema 类似,但语法更简洁,并且支持两种主要的语法:

  • XML 语法
  • Compact 语法

它被认为比 XML Schema 更易于使用和理解,尤其适合简单的 XML 结构。


6. XML 验证工具

为了确保 XML 文档符合规定的模式,可以使用一些验证工具来执行验证。这些工具会检查 XML 是否符合 DTD、XML Schema 或其他约束。常见的验证工具包括:

  • XMLSpy:支持 DTD、XML Schema 等格式的验证。
  • Saxon:一个支持 XML Schema 和 XSLT 的处理器,提供验证功能。
  • xmllint:一个命令行工具,支持 DTD 和 XML Schema 验证。
  • Java SAXParser 或 DOMParser:Java 提供的 XML 解析器,可以在解析 XML 时进行验证。

示例:使用 xmllint 进行 XML 验证

xmllint --noout --schema person.xsd person.xml

这个命令将验证 person.xml 文件是否符合 person.xsd Schema 的定义。


7. 总结

XML 验证是确保 XML 文档符合预定结构和数据规则的重要步骤。通过使用 DTD、XML Schema 或 Relax NG,可以对 XML 文档进行结构和数据验证,确保文档的正确性和一致性。验证不仅有助于发现格式错误,还可以保证数据在不同系统之间传输时的可靠性和正确性。