1. 程式人生 > >XML 文件定義的兩種形式(DTD,SCHEMA)

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元素可以直接將其指向另一個模組,使文件更加具有可讀性。