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 的优点
- 数据类型支持:XML Schema 支持丰富的数据类型(字符串、整数、日期等),可以精确地定义元素和属性的类型。
- 命名空间支持:支持 XML 命名空间,有助于避免名称冲突。
- 可扩展性:可以通过类型继承和组合来定义复杂的数据结构。
- 可重用性:可以通过引入和包含其他 Schema 文件,复用已有的 Schema 定义。
- 可验证性:提供了强大的验证机制,确保 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 |
重用性 | 较差 | 高,通过类型继承和组合 |