XML 文件定義的兩種形式(DTD,SCHEMA)
XML DTD是目前使用比較廣泛的一種XML模式,而XML SCHEMA是W3C官方推薦的XML定義格式。
DTD 指定:可以在文件中存在的元素、那些元素可以具有的屬性、在元素內部元素的層次結構以及元素在整個文件中出現的順序。
XML Schema 是基於 XML 的 DTD 替代者。XML Schema 可描述 XML 文件的結構。XML Schema 語言也可作為 XSD(XML Schema Definition)來引用。
結構良好的XML文件——如果某個文件符合XML語法規範,那麼我們就說這個文件是“結構良好”的文件。使用本書講到的XMLSpy 2006工具就可以測試某文件是否為結構良好的XML文件。
有效的XML文件——所謂有效的XML文件是指通過了DTD的驗證的,具有良好結構的XML文件,在此大家要明白XML文件可分為結構良好的XML文件和有效的XML文件,以及他們之間的關係。即具有結構良好的XML文件並不一定就是有效的XML文件,反之一個有效的XML文件必定是一個結構良好的XML文件。
xml schema 與 xml dtd 區別:
XML Schema和DTD都用於文件驗證,但二者還有一定區別,本質區別:schema本身是xml的,可以被XML解析器解析(這也是從DTD上發展schema的根本目的)。另外:
XML Schema是內容開放模型,可擴充套件,功能性強;而DTD可擴充套件性差;
XML Schema支援豐富的資料型別,而DTD不支援元素的資料型別,對屬性的型別定義也很有限;
XML Schema支援名稱空間機制,而DTD不支援;
XML Schema可針對不同情況對整個XML文件或文件區域性進行驗證;而DTD缺乏這種靈活性;
XML Schema完全遵循XML規範,符合XML語法,可以和DOM結合使用,功能強大;而DTD語法本身有自身的語法和要求,難以學習;
1. 最簡單的Schema文件
如何寫一個最簡單的XML Schema文件呢?
首先,我們寫出一個最簡單的XML文件。
hello.xml
-------------------
<?xml version="1.0"?>
<greeting>Hello World!!</greeting>
<!--一個根元素:greeting;且這個元素不含屬性,無子元素,內容是字串。-->
hello.xsd
----------
<?xml version="1.0"?>
<xsd:element name="greeting" type="xsd:string"/>
</xsd:schema>
XML Schema文件字尾名是.xsd,完全符合XML語法,根元素是schema,名稱空間xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定義例項文件中的元素,如greeting。
2. 含子元素的Schema文件
假設例項文件是如下的:
customer.xml
-----------
<customer>
<name>teiki</name>
<address>No.237, Road Waitan, Shanghai</address>
</customer>
則可以寫出以下的XML Schema文件:
customer.xsd
----------------
<?xml version="1.0"?>
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="address" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
例項文件customer.xml中,<customer>元素含有兩個子元素,所以我們在Schema文件中採用ComplexType來定義該元素。sequence表示子元素依次出現的順序。
3. 含子元素和孫元素的Schema文件
這次我們給出一個更加複雜一些的文件:
customer.xml
---------------
<customer>
<name>Teiki</name>
<address>
<!-- address追加一個地址子元素 -->
<prefecture>Zhejiang</prefecture>
<city>Hangzhou</city>
<street>Xilu Road, No.121, 7F</street>
</address>
</customer>
為此,我們需要一個更加複雜一點的Schema文件:
address.xsd
-----------------
<?xml version="1.0"?>
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<!-- 追加子元素address-->
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="prefecture" type="xsd:string"/>
<xsd:element name="city" type="xsd:string" />
<xsd:element name="street" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
不過,我們還可以採用ref元素來重新編寫這個Schema文件:
address2.xsd
----------------------
<?xml version="1.0"?>
<xsd:element name="customer">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element ref="address"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="prefecture" type="xsd:string"/>
<xsd:element name="city" type="xsd:string" />
<xsd:element name="street" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
使用ref元素可以直接將其指向另一個模組,使文件更加具有可讀性。