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
重用性 较差 高,通过类型继承和组合
相关推荐
Nu11PointerException2 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
2401_850410832 小时前
文件系统和日志管理
linux·运维·服务器
亦枫Leonlew3 小时前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
考试宝3 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
一只哒布刘4 小时前
NFS服务器
运维·服务器
黑叶白树5 小时前
简单的签到程序 python笔记
笔记·python
lihuhelihu6 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
幸运超级加倍~6 小时前
软件设计师-上午题-15 计算机网络(5分)
笔记·计算机网络
山东布谷科技官方6 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
爱吃喵的鲤鱼6 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++