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 文檔才算有效的非常強大和靈活的方式。