DTD和Schema簡介
DTD和Shema用來定義將用來表示數(shù)據(jù)的元素
DTD語法:
例子:
<!-- address.dtd -->
<!ELEMENT address (name, street, city, state, postal-code)>
<!--ELEMENT 是元素定義的關(guān)鍵字,要大寫,并且注意前面不能加空格,后面要留一個(gè)空格?,元素名后也要有一個(gè)空格-->
<!--元素后面的括號里面定義了它與其他元素的層次關(guān)系,同時(shí)也定義了子元素的實(shí)現(xiàn)順序-->
<!ELEMENT name (title? first-name, last-name)>
<!-- 關(guān)于定義元素意義相關(guān)的符號有以下幾種:
?語義符號:??????
??????????這個(gè)元素要么有一個(gè)要么沒有。
????????*???這個(gè)元素要么沒有,要么有多個(gè)。(閉包)
????????+???這個(gè)元素要么有一個(gè)要么有多個(gè)。(正閉包)
?關(guān)系符號:
?????????|????豎線符號表示選擇列表 例如可以這樣寫:<!ELEMENT name ((title|first-name)?, last-name)>
?????????表示tiltle和first-name可以二選一個(gè)。
-->
<!ELEMENT title (#PCDATA)> <!-- PCDATA表示title元素的類型為字符類型-->
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<!ELEMENT city (#PCDATA)>
<!--關(guān)于屬性-->
<!ATTLIST city state CDATA#REQUIRED
關(guān)鍵字 CDATA
和 #REQUIRED
告訴解析器 state
屬性包含文本并且是必需的(如果它是可選的,用 CDATA #IMPLIED
即可)。
postal_code CDATA (1|2|3|4|5|6) "1">
定義了一個(gè)屬性的可選表,并且指定了一個(gè)默認(rèn)的值是1。
Schema簡介
使用 XML 模式,您會有更多的能力來定義什么樣的 XML 文檔是有效的。它們與 DTD 相比有幾個(gè)優(yōu)勢。
1。XML 模式使用 XML 語法。換句話說,XML 模式是一個(gè) XML 文檔。這意味著您可以象處理任何其它文檔一樣處理模式。例如,您可以編寫一個(gè) XSLT 樣式表,該樣式表將 XML 模式轉(zhuǎn)換成具有自動生成的 JavaScript 代碼的 Web 表單,其中的 JavaScript 代碼可以驗(yàn)證您輸入的數(shù)據(jù)。
2。XML 模式支持?jǐn)?shù)據(jù)類型。盡管 DTD 確實(shí)支持?jǐn)?shù)據(jù)類型,但很明顯這些數(shù)據(jù)類型是從發(fā)布的角度開發(fā)的。XML 模式支持 DTD 中的所有原始數(shù)據(jù)類型(諸如標(biāo)識和標(biāo)識引用之類的類型)。它們還支持整數(shù)、浮點(diǎn)數(shù)、日期、時(shí)間、字符串、URL 和其它對數(shù)據(jù)處理和驗(yàn)證有用的數(shù)據(jù)類型。
3。XML 模式是可擴(kuò)展的。除了 XML 模式規(guī)范中定義的數(shù)據(jù)類型以外,您還可以創(chuàng)建自己的數(shù)據(jù)類型,并且可以基于其它數(shù)據(jù)類型派生出新的數(shù)據(jù)類型。
4。XML 模式有更強(qiáng)的表達(dá)能力。例如,您可以用 XML 模式定義任何 <state>
屬性值不得超過 2 個(gè)字符,或定義任何 <postal-code>
元素的值必須與正則表達(dá)式 [0-9]{5}(-[0-9]{4})?
相匹配。您無法用 DTD 做這些事。
通過一個(gè)簡單事例介紹Schema語法:
下面是與原始名稱和地址 DTD 相匹配的 XML 模式。它增加了兩個(gè)約束:<state>
元素的值必須剛好是兩個(gè)字符長,<postal-code>
元素的值必須與正則表達(dá)式 [0-9]{5}(-[0-9]{4})?
相匹配。盡管這個(gè)模式比 DTD 長很多,但它更清楚地表達(dá)了有效的文檔看起來是什么樣子:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
XML 模式用 <xsd:element>
元素定義了一些 XML 元素。頭兩個(gè)定義的元素(<address>
和 <name>
)由其它元素組成。<xsd:sequence>
元素定義了包含在這兩個(gè)元素中的元素的序列
? <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>
包含一個(gè) <name>
、一個(gè) <street>
、一個(gè) <city>
、一個(gè) <state>
和一個(gè) <postal-code>
元素,并且依照上面的次序。請注意,該模式實(shí)際上用 <xsd:complexType>
元素定義了新的數(shù)據(jù)類型
? <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>
大多數(shù)元素包含文本;定義它們很簡單。您只要聲明新的元素,然后指定它的數(shù)據(jù)類型為 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"/>
定義模式中的元素內(nèi)容
樣本模式為兩個(gè)元素的內(nèi)容定義了約束:<state>
元素的內(nèi)容必須是兩個(gè)字符長,而 <postal-code>
元素的內(nèi)容必須與正則表達(dá)式 [0-9]{5}(-[0-9]{4})?
匹配。下面演示如何做到那一點(diǎn):
? <xsd:element name="state">
??? <xsd:simpleType>
????? <xsd:restriction base="xsd:string">
??????? <xsd:length value="2"/>
????? </xsd:restriction>
??? </xsd:simpleType>
? </xsd:element>
對于 <state>
和 <postal-code>
元素,模式用約束定義了新的數(shù)據(jù)類型。第一個(gè)情況使用 <xsd:length>
元素,而第二個(gè)情況則使用 <xsd:pattern>
元素定義該元素必須匹配的正則表達(dá)式。
? <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 模式能力的表面;有整本的書籍討論這個(gè)主題。就這篇介紹性文章而言,我們足以說明 XML 模式是描述什么樣的 XML 文檔才算有效的非常強(qiáng)大和靈活的方式。