DTD和Schema简介
DTD和Shema用来定义将用来表示数据的元素
DTD语法:
例子:
<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!--ELEMENT 是元素定义的关键字,要大写,并且注意前面不能加空格,后面要留一个空格 ,元素名后也要有一个空格-->
<!--元素后面的括号里面定义了它与其他元素的层次关系,同时也定义了子元素的实现顺序-->
<!ELEMENT name (title? first-name, last-name)>
<!-- 关于定义元素意义相关的符号有以下几种:
语义符号:
? 这个元素要么有一个要么没有。
* 这个元素要么没有,要么有多个。(闭包)
+ 这个元素要么有一个要么有多个。(正闭包)
关系符号:
| 竖线符号表示选择列表 例如可以这样写:<!ELEMENT name ((title|first-name)?, last-name)>
表示tiltle和first-name可以二选一个。
-->
<!ELEMENT title (#PCDATA)> <!-- PCDATA表示title元素的类型为字符类型-->
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!--关于属性-->
<!ATTLIST city state CDATA#REQUIRED
关键字 CDATA
和 #REQUIRED
告诉解析器 state
属性包含文本并且是必需的(如果它是可选的,用 CDATA #IMPLIED
即可)。
postal_code CDATA (1|2|3|4|5|6) "1">
定义了一个属性的可选表,并且指定了一个默认的值是1。
Schema简介
使用 XML 模式,您会有更多的能力来定义什么样的 XML 文档是有效的。它们与 DTD 相比有几个优势。
1。XML 模式使用 XML 语法。换句话说,XML 模式是一个 XML 文档。这意味着您可以象处理任何其它文档一样处理模式。例如,您可以编写一个 XSLT 样式表,该样式表将 XML 模式转换成具有自动生成的 JavaScript 代码的 Web 表单,其中的 JavaScript 代码可以验证您输入的数据。
2。XML 模式支持数据类型。尽管 DTD 确实支持数据类型,但很明显这些数据类型是从发布的角度开发的。XML 模式支持 DTD 中的所有原始数据类型(诸如标识和标识引用之类的类型)。它们还支持整数、浮点数、日期、时间、字符串、URL 和其它对数据处理和验证有用的数据类型。
3。XML 模式是可扩展的。除了 XML 模式规范中定义的数据类型以外,您还可以创建自己的数据类型,并且可以基于其它数据类型派生出新的数据类型。
4。XML 模式有更强的表达能力。例如,您可以用 XML 模式定义任何 <state>
属性值不得超过 2 个字符,或定义任何 <postal-code>
元素的值必须与正则表达式 [0-9]{5}(-[0-9]{4})?
相匹配。您无法用 DTD 做这些事。
通过一个简单事例介绍Schema语法:
下面是与原始名称和地址 DTD 相匹配的 XML 模式。它增加了两个约束:<state>
元素的值必须刚好是两个字符长,<postal-code>
元素的值必须与正则表达式 [0-9]{5}(-[0-9]{4})?
相匹配。尽管这个模式比 DTD 长很多,但它更清楚地表达了有效的文档看起来是什么样子:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
XML 模式用 <xsd:element>
元素定义了一些 XML 元素。头两个定义的元素(<address>
和 <name>
)由其它元素组成。<xsd:sequence>
元素定义了包含在这两个元素中的元素的序列
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="name"/>
<xsd:element ref="street"/>
<xsd:element ref="city"/>
<xsd:element ref="state"/>
<xsd:element ref="postal-code"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
与 DTD 版本一样,XML 模式示例定义 <address>
包含一个 <name>
、一个 <street>
、一个 <city>
、一个 <state>
和一个 <postal-code>
元素,并且依照上面的次序。请注意,该模式实际上用 <xsd:complexType>
元素定义了新的数据类型
<xsd:element name="name">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="title" minOccurs="0"/>
<xsd:element ref="first-Name"/>
<xsd:element ref="last-Name"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
大多数元素包含文本;定义它们很简单。您只要声明新的元素,然后指定它的数据类型为 xsd:string
:
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="first-Name" type="xsd:string"/>
<xsd:element name="last-Name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
<xsd:element name="city" type="xsd:string"/>
定义模式中的元素内容
样本模式为两个元素的内容定义了约束:<state>
元素的内容必须是两个字符长,而 <postal-code>
元素的内容必须与正则表达式 [0-9]{5}(-[0-9]{4})?
匹配。下面演示如何做到那一点:
<xsd:element name="state">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:length value="2"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
对于 <state>
和 <postal-code>
元素,模式用约束定义了新的数据类型。第一个情况使用 <xsd:length>
元素,而第二个情况则使用 <xsd:pattern>
元素定义该元素必须匹配的正则表达式。
<xsd:element name="postal-code">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{5}(-[0-9]{4})?"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
这里概要的介绍仅仅触及 XML 模式能力的表面;有整本的书籍讨论这个主题。就这篇介绍性文章而言,我们足以说明 XML 模式是描述什么样的 XML 文档才算有效的非常强大和灵活的方式。