XML 验证

两个重要概念

  1. 形式良好(格式良好 /well‑formed)XML

满足 XML 基础语法规则,标签写得没有语法错误。

  1. 合法(valid)XML

首先必须是形式良好,并且还要通过 DTD / Schema 的规则校验。

一句话区分:

形式良好:语法不出错;

合法:语法正确 + 符合预先定义的文档结构规范。

形式良好 XML 需要遵守的规则

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>
Code language: HTML, XML (xml)

要求:

  1. 有且仅有一个根元素
  2. 所有元素必须带关闭标签
  3. 标签大小写敏感
  4. 标签正确嵌套,不能交叉
  5. 属性值必须加引号

只要违反任意一条 → 不是形式良好,解析器直接报错,文档无法读取。

合法 XML:引入 DTD 校验结构

DTD(文档类型定义):用来规定 XML 文档应该是什么结构,规定允许哪些标签、标签顺序、标签里面放什么内容。

示例(引用外部 dtd 文件)

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>
Code language: HTML, XML (xml)
  • <!DOCTYPE note SYSTEM "Note.dtd">:DOCTYPE 声明,引用外部 DTD 文件
  • DTD 会约束 note 里面必须依次出现 to、from、heading、body,不能乱加别的标签,顺序不能乱。

内部 DTD(写在 xml 文档内部,不引用外部文件)

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>
Code language: HTML, XML (xml)
  • <!ELEMENT note (to,from,heading,body)>:规定note下面必须按顺序包含四个子元素
  • (#PCDATA):代表元素里面存放普通文本数据,不能嵌套子标签

说明:DTD 详细语法属于拓展内容,本课只需要理解作用。

XML Schema(XSD)

  • W3C 推出,作为 DTD 的替代方案。
  • Schema 本身就是 XML 格式编写;DTD 不是 XML 语法。
  • 支持丰富的数据类型(字符串、数字、日期等),比 DTD 功能更强。

简单示例片段:

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="to"      type="xs:string"/>
        <xs:element name="from"    type="xs:string"/>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="body"    type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
Code language: HTML, XML (xml)
  • <xs:sequence>:代表子元素必须按定义顺序出现。

Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注