在過去我們用 DTD 來定義 XML 文檔的和法性,而現在可以利用 XML Schema (XML Schema Definition,XSD)來替代 DTD。同 DTD 相同,XML Schema 描述了 XML 文檔的結構,既然如此,那麼我們為什麼要選擇 XML Schema 而不是 DTD 呢?
1、XML Schema 可針對未來的需求進行擴展,DTD 不易擴展。
2、XML Schema 更完善,功能更強大。
3、XML Schema 基於 XML 編寫,一個 XML Schema 也是一個 XML 文件。DTD 不遵循 XML 語法,這表示你不得不多去學習另外一門語言。
4、XML Schema 支持數據類型,內置多種數據類型。DTD 數據類型有限。
5、XML Schema 支持命名空間,DTD 不支持命名空間。
6、XML Schema 在 2001年5月2日成為 W3C 標准。
最近正在將 Grapevine 升級至第2代版本 ,將全 xml 配置轉為 Annotation + xml 的方式。如此一來,將大大簡化 xml 文件的配置,提高生產效率。我們來看看 Grapevine2 中最基礎的 xml 配置是如何利用 XML Schema 進行驗證的。
<?XML version="1.0" encoding="UTF-8"?>
<GRAPEVINE>
<GRAPE class=test.TestAbc id=resourceTestAbc />
<GRAPE class=Java.lang.String id=stringName value="ok..." />
</GRAPEVINE>
這是一個再簡單不過的 xml 文件,僅僅包含了 grapevine 根元素和 grape 子元素。grape 子元素中包含了 id、class、value 三個屬性。其中 id 和 class 為必選屬性, value 為可選。再來看看 xsd (XML Schema)文件內容。
<?XML version="1.0" encoding="ISO-8859-1" ?>
<XS:SCHEMA xmlns:xs="http://www.w3.org/2001/XMLSchema">
<XS:ELEMENT name="grapevine">
<XS:COMPLEXTYPE>
<XS:SEQUENCE>
<XS:ELEMENT name="grape" minOccurs="0" maxOccurs="unbounded">
<XS:COMPLEXTYPE>
<XS:ATTRIBUTE name="id" use="required" type="xs:string" />
<XS:ATTRIBUTE name="class" use="required" type="xs:string" />
<XS:ATTRIBUTE name="value" type="xs:string" />
</XS:COMPLEXTYPE>
</XS:ELEMENT>
</XS:SEQUENCE>
</XS:COMPLEXTYPE>
<XS:UNIQUE name="idUnique">
<XS:SELECTOR xpath=".//grape" />
<XS:FIELD xpath="@id" />
</XS:UNIQUE>
</XS:ELEMENT>
</XS:SCHEMA>
在上面的 schema 中,我們使用了標准的命名空間 (xs),與此命名空間相關聯的 URI 是 Schema 的語言定義(Schema language definition),其標准值是 http://www.w3.org/2001/XMLSchema。
接下來我們定義了 grapevine 元素,該元素包含了 grape 元素,grape 用 xs:element 定義,並由 xs:sequence 包圍。maxOccurs=”unbounded” 表示該元素出現次數沒有限制。minOccurs=”0″ 表示該元素可以不出現。grape 元素的三個屬性由 xs:attribute 定義,其中 type=”xs:string” 表示該屬性的數據類型 ( XML Schema 擁有多種內建數據類型,如:xs:string、xs:integer、xs:boolean、xs:date 等)。use=”required” 表示該屬性是必選的,若不定義表示該屬性為可選的。
我們定義相同 id 的 grape 元素在 grapevine 中是唯一的,所以必須對 grape 的 id 屬性進行唯一性驗證。xs:unique 用來定義一個唯一性驗證,你也可以用多個 xs:unique 對多個元素或屬性進行驗證。這裡我們只針對 id 屬性,所以命名為 idUnique 。xs:selector 用來定義其范圍,xs:fIEld 定義驗證的值。也可以針對元素內容進行驗證,如下:
<ID>resourceTestAbc</ID>
<XS:UNIQUE name="idUnique">
<XS:SELECTOR xpath=".//grape" />
<XS:FIELD xpath="id" />
</XS:UNIQUE>
resourceTestAbc
利用xsd文件校驗XML文件的Java代碼:
try {
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
.newSchema(new File("grapevine.xsd")).newValidator()
.validate(new StreamSource(XMLPath));
} catch (Exception ex) {
// 驗證失敗
}
try {
SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema")
.newSchema(new File("grapevine.xsd")).newValidator()
.validate(new StreamSource(XMLPath));
} catch (Exception ex) {
// 驗證失敗
}
Popularity: 47%