擁有正確語法的 XML 被稱爲“形式良好”的 XML。
通過某個 DTD 進行了驗證的 XML 是“合法”的 XML。
1. 形式良好的 XML 文檔
一個"形式良好"的 XML 文檔擁有正確的語法
一個"形式良好"的 XML 文檔會遵守前幾章介紹過的 XML 語法規則:
- XML 文檔必須有根元素
- XML 文檔必須有關閉標籤
- XML 標籤對大小寫敏感
- XML 元素必須被正確的嵌套
- XML 屬性必須加引號
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
2. 驗證 XML 文檔
一個合法的 XML 文檔是"形式良好"的 XML 文檔,同樣遵守文檔類型定義 (DTD) 的語法規則
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
在上例中,DOCTYPE
聲明是對外部 DTD 文件的引用。下面的段落展示了這個文件的內容。
2.1 XML DTD
DTD 的作用是定義 XML 文檔的結構。它使用一系列合法的元素來定義文檔結構:
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
2.1.1爲什麼使用 DTD?
- 通過 DTD,每一個 XML 文件均可攜帶一個有關其自身格式的描述。
- 通過 DTD,獨立的團體可一致地使用某個標準的 DTD 來交換數據。
- 而應用程序也可使用某個標準的 DTD 來驗證從外部接收到的數據。
- 還可以使用 DTD 來驗證自身的數據。
2.2 XML Schema(基於 XML 的 DTD 代替者)
- W3C 支持一種基於 XML 的 DTD 代替者,它名爲 XML Schema:
- XML Schema 是基於 XML 的 DTD 替代者。
- XML Schema 描述 XML 文檔的結構。
- XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
- XML Schema 在 2001 年 5 月 2 日成爲 W3C 標準。
實例:
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
2.2.1 爲什麼使用Schema
- 定義可出現在文檔中的元素
- 定義可出現在文檔中的屬性
- 定義哪個元素是子元素
- 定義子元素的次序
- 定義子元素的數目
- 定義元素是否爲空,或者是否可包含文本
- 定義元素和屬性的數據類型
2.2.2 XML Schema是DTD的繼任者
理由如下:
- XML Schema 可針對未來的需求進行擴展
- XML Schema 更完善,功能更強大
- XML Schema 基於 XML 編寫
- XML Schema 支持數據類型
- XML Schema 支持命名空間
2.2.3 XML Schema 支持數據類型
通過對數據類型的支持:
- 可更容易地描述允許的文檔內容
- 可更容易地驗證數據的正確性
- 可更容易地與來自數據庫的數據一併工作
- 可更容易地定義數據約束(data facets)
- 可更容易地定義數據模型(或稱數據格式)
- 可更容易地在不同的數據類型間轉換數據
注: 數據約束,或稱 facets,是 XML Schema 原型中的一個術語,中文可譯爲“面”,用來約束數據類型的容許值。
2.2.4 由 XML 編寫 XML Schema 有很多好處:
- 不必學習新的語言
- 可使用 XML 編輯器來編輯 Schema 文件
- 可使用 XML 解析器來解析 Schema 文件
- 可通過 XML DOM 來處理 Schema
- 可通過 XSLT 來轉換 Schema
2.2.5 XML Schema 可保護數據通信
- 當數據從發送方被髮送到接受方時,其要點是雙方應有關於內容的相同的“期望值”。
- 通過 XML Schema,發送方可以用一種接受方能夠明白的方式來描述數據。
- 一種數據,比如
"03-11-2004"
,在某些國家被解釋爲11月3日,而在另一些國家爲當作3月11日。 - 但是一個帶有數據類型的 XML 元素,比如:
<date type="date">2004-03-11</date>
,可確保對內容一致的理解,這是因爲 XML 的數據類型 “date”
要求的格式是"YYYY-MM-DD"
。
2.2.6 XML Schema 可擴展
XML Schema 是可擴展的,因爲它們由 XML 編寫。
通過可擴展的 Schema 定義,你可以:
- 在其他 Schema 中重複使用你的 Schema
- 創建由標準類型衍生而來的你自己的數據類型
- 在相同的文檔中引用多重的 Schema
2.2.7 形式良好是不夠的
我們把符合 XML 語法的文檔稱爲形式良好的 XML 文檔,比如:
- 它必須以 XML 聲明開頭
- 它必須擁有唯一的根元素
- 開始標籤必須與結束標籤相匹配
- 元素對大小寫敏感
- 所有的元素都必須關閉
- 所有的元素都必須正確地嵌套
- 必須對特殊字符使用實體
即使文檔的形式良好,仍然不能保證它們不會包含錯誤,並且這些錯誤可能會產生嚴重的後果。
請考慮下面的情況:您訂購的了 5 打激光打印機,而不是 5 臺。通過 XML Schema,大部分這樣的錯誤會被您的驗證軟件捕獲到。