XML的两种常用的模式定义方式

XML的两种常用的模式定义方式


DTD(Document Type Definition)用于定义 XML 文档的结构和合法元素。它包括元素声明、属性列表声明、实体声明和注释等部分。下面详细介绍 DTD 的各个组成部分及其结构。

DTD

DTD 的结构

1. 元素声明(Element Declaration)

元素声明定义了 XML 文档中允许的元素及其内容模型。

  • 空元素(Empty Element):不包含任何内容。

    xml 复制代码
    <!ELEMENT element-name EMPTY>
  • 仅包含文本的元素:只包含字符数据。

    xml 复制代码
    <!ELEMENT element-name (#PCDATA)>
  • 元素内容模型:包含子元素,定义顺序和数量。

    • 顺序 :用逗号分隔,表示子元素必须按顺序出现。

      xml 复制代码
      <!ELEMENT element-name (child1, child2, child3)>
    • 选择 :用竖线分隔,表示子元素之一可以出现。

      xml 复制代码
      <!ELEMENT element-name (child1 | child2 | child3)>
    • 重复 :表示子元素可以出现的次数。

      • *:0 次或多次
      • +:1 次或多次
      • ?:0 次或 1 次
      xml 复制代码
      <!ELEMENT element-name (child1*, child2?, child3+)>
示例
xml 复制代码
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
2. 属性列表声明(Attribute List Declaration)

属性列表声明定义了元素可以包含的属性及其类型。

  • CDATA:字符数据。
  • ID:唯一标识符。
  • IDREF:引用另一个元素的 ID。
  • IDREFS:多个 IDREF,用空格分隔。
  • ENTITY:引用未解析的实体。
  • ENTITIES:多个 ENTITY,用空格分隔。
  • NMTOKEN:名称令牌。
  • NMTOKENS:多个 NMTOKEN,用空格分隔。
  • 枚举类型:列出所有可能的值。

属性声明语法:

xml 复制代码
<!ATTLIST element-name attribute-name attribute-type default-value>
示例
xml 复制代码
<!ATTLIST note category CDATA #IMPLIED>
<!ATTLIST note id ID #REQUIRED>
<!ATTLIST note lang (en | fr | de) "en">
3. 实体声明(Entity Declaration)

实体声明定义了可重用的文本片段或字符实体。

  • 内部实体 :在 DTD 中定义并使用。

    xml 复制代码
    <!ENTITY entity-name "replacement text">
  • 外部实体 :引用外部文件。

    xml 复制代码
    <!ENTITY entity-name SYSTEM "URI">
示例
xml 复制代码
<!ENTITY author "John Doe">
<!ENTITY externalFile SYSTEM "file:///path/to/file.txt">
4. 注释(Comments)

注释用于提供关于文档结构的说明,不会被解析器处理。

xml 复制代码
<!-- This is a comment -->

内部 DTD 和外部 DTD

内部 DTD

内部 DTD 在 XML 文档内部定义。

xml 复制代码
<!DOCTYPE note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ATTLIST note lang CDATA #IMPLIED>
<!ENTITY author "John Doe">
]>

<note lang="en">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>
外部 DTD

外部 DTD 存储在单独的文件中,并在 XML 文档中引用。

note.dtd:

xml 复制代码
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ATTLIST note lang CDATA #IMPLIED>
<!ENTITY author "John Doe">

note.xml:

xml 复制代码
<!DOCTYPE note SYSTEM "note.dtd">
<note lang="en">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

总结

DTD 用于定义 XML 文档的结构和合法元素,确保 XML 文档符合预定的规范。通过元素声明、属性列表声明、实体声明和注释等部分,DTD 提供了一种标准化的方法来描述 XML 文档的结构。理解和使用 DTD,可以帮助开发者创建更加健壮和一致的 XML 文档。

XML Schema

XML Schema 是一种用于定义 XML 文档结构、内容和数据类型的语言,它比 DTD 更加灵活和强大。XML Schema 使用 XML 本身的语法,可以精确地定义数据类型、约束和结构。以下是 XML Schema 的结构及其主要组成部分的详细介绍。

XML Schema 的结构

XML Schema 的根元素是 <xs:schema>,它包含了整个 Schema 定义。主要的组成部分包括元素声明、属性声明、简单类型和复杂类型等。

1. 根元素 <xs:schema>

根元素 <xs:schema> 定义了 XML Schema 的命名空间和版本。

xml 复制代码
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Schema content goes here -->
</xs:schema>
2. 元素声明(Element Declaration)

元素声明定义了 XML 文档中允许的元素及其类型。

xml 复制代码
<xs:element name="element-name" type="element-type"/>
示例
xml 复制代码
<xs:element name="note" type="NoteType"/>
3. 复杂类型(Complex Type)

复杂类型用于定义具有嵌套元素和属性的元素。可以使用 <xs:complexType> 元素定义。

xml 复制代码
<xs:complexType name="complex-type-name">
    <!-- Content model goes here -->
</xs:complexType>
示例
xml 复制代码
<xs:complexType name="NoteType">
    <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>
4. 属性声明(Attribute Declaration)

属性声明定义了元素可以包含的属性及其数据类型。

xml 复制代码
<xs:attribute name="attribute-name" type="attribute-type" use="optional|required"/>
示例
xml 复制代码
<xs:attribute name="lang" type="xs:string" use="optional"/>
5. 简单类型(Simple Type)

简单类型用于定义基本数据类型和约束。可以使用 <xs:simpleType> 元素定义。

xml 复制代码
<xs:simpleType name="simple-type-name">
    <!-- Restriction model goes here -->
</xs:simpleType>
示例
xml 复制代码
<xs:simpleType name="LanguageType">
    <xs:restriction base="xs:string">
        <xs:enumeration value="en"/>
        <xs:enumeration value="fr"/>
        <xs:enumeration value="de"/>
    </xs:restriction>
</xs:simpleType>
6. 引用其他 Schema

可以使用 importinclude 元素引用其他 Schema。

xml 复制代码
<xs:import namespace="http://www.example.com/namespace" schemaLocation="other-schema.xsd"/>
<xs:include schemaLocation="included-schema.xsd"/>

XML Schema 示例

以下是一个完整的 XML Schema 示例,定义了一个简单的 XML 文档结构。

schema.xsd:

xml 复制代码
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="note" type="NoteType"/>

    <xs:complexType name="NoteType">
        <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:attribute name="lang" type="xs:string" use="optional"/>
    </xs:complexType>
</xs:schema>

note.xml:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="schema.xsd">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

XML Schema 的优点

  1. 数据类型支持:XML Schema 支持丰富的数据类型(字符串、整数、日期等),可以精确地定义元素和属性的类型。
  2. 命名空间支持:支持 XML 命名空间,有助于避免名称冲突。
  3. 可扩展性:可以通过类型继承和组合来定义复杂的数据结构。
  4. 可重用性:可以通过引入和包含其他 Schema 文件,复用已有的 Schema 定义。
  5. 可验证性:提供了强大的验证机制,确保 XML 文档符合定义的结构和规则。

总结

XML Schema 是一种强大而灵活的工具,用于定义 XML 文档的结构、内容和数据类型。通过理解 XML Schema 的基本组成部分和结构,可以创建更加复杂和精确的 XML 模式定义,从而确保 XML 文档的有效性和一致性。XML Schema 提供了比 DTD 更强大的功能,是现代 XML 应用中的首选模式定义方法。

DTD 与 XML Schema 的对比

特性 DTD XML Schema
语法 专用语法 XML 语法
数据类型支持 有限(#PCDATA, ID, IDREF 等) 丰富(string, integer, date 等)
命名空间支持 不支持 支持
可扩展性 有限
可读性 依赖于熟悉程度 易读,类似 XML
重用性 较差 高,通过类型继承和组合
相关推荐
像一只黄油飞5 分钟前
第二章-04-数据类型
笔记·python·学习·零基础
elseif1237 分钟前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲
一叶之秋14127 分钟前
通信之道:解锁Linux进程间通信的无限可能(二)
linux·服务器
唐墨1238 分钟前
linux kernel之设备树
linux·运维·服务器
234710212710 分钟前
4.17 学习笔记
开发语言·软件测试·笔记·python·学习
智者知已应修善业16 分钟前
【51单片机按键控制流水灯+数码管显示按键次数】2023-6-15
c++·经验分享·笔记·算法·51单片机
扣脑壳的FPGAer26 分钟前
数字信号处理学习笔记--Chapter 1.4.1 时域采样定理基本概念
笔记·学习·信号处理
草莓熊Lotso1 小时前
Linux 线程同步与互斥(一):彻底搞懂线程互斥原理、互斥量底层实现与 RAII 封装
linux·运维·服务器·开发语言·数据库·c++
j_xxx404_1 小时前
深入理解Linux底层存储:从物理磁盘架构到文件系统(inode/Block)原理
linux·运维·服务器·后端
kobesdu1 小时前
【ROS2实战笔记-6】RobotPerf:机器人计算系统的基准测试方法论
笔记·机器人·ros