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

可以使用 import 和 include 元素引用其他 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
重用性 较差 高,通过类型继承和组合
相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
-梅3 天前
linux(8) 软硬链接
linux·运维·服务器
陈卫军老师3 天前
陈卫军:把口味写在一张纸上,店才稳得住
经验分享·笔记·流量运营
Wang's Blog3 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
`流年づ3 天前
人工智能学习笔记 - 补充
人工智能·笔记·深度学习·学习
琥珀色糖3 天前
SimlpeHttp
linux·服务器