Xml文檔驗證—基礎篇

Xml文檔驗證—基礎篇

 
發佈時間:2003.03.20 13:47     來源:賽迪網    作者:宋華

一、Xml可擴展性的優勢與隱患

  從Xml(Extensible Markup Language可擴展標記語言)這個名字就可以知道,Xml是易於擴展的。的確,作爲一種描述"元數據"的標記語言,Xml規範雖然爲構建Xml文檔提供了一些基本語法,但是並沒有定義確切的標記,任何人都能夠根據需要使用自定義的元素和屬性爲Xml文檔提供結構信息以擴充標記集。

Xml的可擴展是不難理解的,作爲一種新標記語言,Xml語言提供了一個可擴展的、強有力的標準來描述數據,使得數據可以在應用程序中使用或在不同平臺、不同應用中交換。Xml只關心如何描述數據,並不指定如何爲一個最終用戶或者系統顯示數據。(當然,你可以通過Xml相關的其他技術如XPath、XSlt或者程序語言來操縱和顯示這些數據)。

  在這一點上,Xml與同樣繼承自SGML(Standard Generalized Markup Language 標準通用標記語言)並且也是SGML子集的Html有很大的不同。Html的目的是通過一個(例如一個瀏覽器)來顯示數據,你只能使用那些預先定義的特定標記。例如,要建立一個鏈接,你必須使用<a>標記,並且,你只能在這個標記內使用"href"屬性指定鏈接目標所在的位置;同樣,要在Html中導入一幅圖象,你也只能使用<img>標記,並且只能在這個標記中使用"src"屬性指定圖象文件的路徑。其他Html的元素和屬性也一樣,它們都被預定義了特定的名稱。

  Xml這種允許自由地創建標記和屬性的特點爲應用帶來了極大的方便。根據應用需要,你可以爲那些標記指定更有意義的、自描述的名稱而不用一味遵循那些有可能並不合適的某種限制。比如,你大可用<Link>取代<a>標記,用"path"取代"href"屬性使鏈接一目瞭然。放心,這在Xml規範中是允許的。

  實際上也正是由於Xml可擴展的優點,Xml文檔在各個領域(如科技詞典、法律詞彙表、醫學詞彙表、計算機詞彙表、公用電話交換網絡詞彙等)的標準化建設中得到了廣泛的應用。

這種定製Xml文檔標記的"自由"無疑具有明顯的優勢,並且在特定的環境下的確是這樣。然而, Xml文檔很多時候被用於數據交換,Xml爲標記那些可以在應用程序之間以平臺無關的方式進行交換的數據提供了一種非常有用而且可以擴展的框架。它被廣泛地用於在應用程序對象之間、不同平臺應用中,甚至是Internet上交換數據。這個時候,創建你自己的Xml文檔元素和屬性名字的能力確實需要付出一定的代價,當你想要與其他的不熟悉你的文當結構的客戶或者應用程序交換Xml文檔時,這種代價尤爲突出。所有這些參與者(平臺、應用程序及人)都能正確使用這些Xml文檔嗎?它們中的自定義標記能夠被識別嗎?

  乍看起來,這樣似乎已經導致了混亂。畢竟,如果每個人都可以使用不遵循任何命名規範的標記來創建Xml文檔,其他人怎麼能夠使用這些文檔呢?

 

二、Xml驗證-自由的相對性

 

  看來,完全遵循xml規範的格式正確的文檔並不總能滿足需要。許多情況下還需要保證文檔的有效性。這時,一種"元數據"文檔被創建來定義這個Xml文檔中包含什麼樣的元素、屬性和其他項目。有三種這樣的"元數據"文檔,它們是DTD、XML-DR Schema以及W3C Schema,它們定義了一個Xml文檔必須遵循什麼樣的結構纔是有效的。通過定義Xml文檔的結構,應用能夠在執行任何計算和轉換之前對文檔進行驗證。

  現在很清楚了,你儘可以在xml文檔中自定義所需要的標記以描述數據,任何想使用這個文檔的人也可以使用它,只要你爲他們提供一個文檔是如何組織以及使用什麼樣的標記描述數據的定義即可!由於XSD Schema是萬維網聯盟W3C的推薦標準,下面的驗證均只針對它展開。

 

三、從Xml文檔內部引用Xml Schema驗證

 

  在創建了一個Xml Schema文檔之後,就可以用它來驗證xml文檔的有效性了。做起來很簡單,只需要在xml文檔根元素內引用該schema文件就可以了。不過,根據xml schema文檔是否包含targetNamespace屬性,xml文檔內的引用有以下兩種方式:

  1、使用noNamespceSchemaLocation屬性引用schema文件

  當xml schema文檔不包括targetNamespace屬性時,應當通過xml文檔根元素的noNamespaceSchemaLocation屬性及W3C的schmea實例命名空間(xmlns:xsi="http://www.w3.org/2001/XMLScheam-instance")來引用名xml schema文件。下面的例子引用不包含"targetNamespace"屬性的名爲"noTargetNS.xsd"的架構文件:

<?xml version="1.0" encoding="utf-8" ?>
<Employees  Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
"xsi:noNamespaceSchemaLocation="noTargetNS.xsd">
<Name>LinY</Name>
<Age>42</Age>
</Employees>

  2、使用schemaLocation屬性引用schema文件

  然而,如果xml schmea文件包含了一個targetNamespace 屬性,在xml文檔中就將通過schemaLocation屬性而不是noNamespaceSchemaLocation屬性來引用schema文檔。而且,這個屬性所指定的值必須是完整的。它需要包含以空格分開的兩部分,前一部分是Uri,這個Uri與schema文檔的targetNamespace屬性內部引用的Uri是一致的;後一部分是schema文件完整路徑及名稱。另外,Xml文檔的根元素也必須聲明schema實例名字空間(xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),下面的例子引用包含"targetNamespace"屬性的名爲yesTargetNS.xsd架構文件:

<?Xml version="1.0" encoding="utf-8" ?>
<Employees Xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.tuha.net  yesTargetNS.xsd"
Xmlns="http://www.tuha.net">
<Name>XiaoM</Name>
<Age>25</Age>
</Employees>

  在xml文檔內部正確地引用schema文件之後,在解析xml文檔時將執行驗證。

四、在Visual Studio.Net IDE中使用Xml Schmea驗證

  Visual Studio.Net IDE爲使用xml架構提供了豐富的支持。其集成的xml架構設計器,能夠以組件拖放的方式創建xml架構文檔;集成的xml文檔設計器,能夠基於現有xml文檔創建xml架構。這之後,你可以關聯xml文檔和xml架構文件並執行xml文檔的正確性及有效性驗證操作。這樣做時,你只需要作簡單的代碼修改甚至不用手寫一行代碼就能完整文檔驗證的所有工作。

  1、創建xml架構

  可以通過任何文本編輯器創建xml架構文件,顯然,這樣做比較麻煩的,你必須熟知架構文檔的規範。作爲補充,Visual Studio.Net IDE中提供了好幾種創建Xml架構文檔的簡單方式。使用Xml 架構設計器,從工具箱中拖入你需要的節點元素組件,就可以完成xml架構文檔創建的絕大部分工作(如果你不需要修改節點數據類型的話,這也是創建xml架構文件的全部工作)。特別地,如果你已經創建了xml文檔,你可以基於現有 XML 文件創建架構,通過簡單的操作,就可以生成此xml文檔應遵循的xml架構文件:

    1.將Xml源文檔(.xml 文件)加載到"Xml設計器"中。

    2.從IDE菜單欄中選擇"XML"菜單項並單擊"創建架構"。

  就這麼簡單,查看項目"所有文件",你會發現,與xml文檔同名的 XML 架構(.xsd 文件)生成了。

  不過,以這種方法產生xml架構時,所有數據類型都被默認設置爲 xsd:string類型,因此,可能需要修改它們以符合 Xml文檔的需要。

  2、關聯xml文檔和xml架構文件

  如果已經創建了xml源文件和Xml架構文件,要使該xml架構文件對xml文檔發生作用,必須將xml源文件和xml架構文件關聯起來。在Visual Studio.Net IDE(集成開發環境)中,實現這一關聯非常簡單,通過定義Xml文件的targetSchema屬性就可以完成:

    1.將Xml 文件加載到"Xml 設計器"中。

    2.切換到"Xml"視圖模式。

    3.在屬性窗口中,從"targetSchema"屬性的下拉列表中選擇與名字空間相關聯的的架構文件。

  這時你應該會注意到,targetSchema屬性的下拉框將列出該項目包括的所有xml架構及一些建議的規範,包括相應的名字空間。這同時也告訴我們,如果所需要的xml架構並不包含在該項目中,你將需要在這裏鍵入將用於驗證 XML 文檔的架構的統一資源標識符 (URI)。

完成這幾步後,返回查看你的xml源文件,會發現,在根元素內,xml架構以默認名字空間被引用。

  附帶說明一下,清除targetSchema屬性的內容就可以移除xml文檔與xml架構間的關聯。

  3、執行驗證操作

  將xml架構文件與 Xml源文件關聯後,"Xml 設計器"的驗證功能可以檢查Xml文件是否有效:

    1.將要檢查的 XML 文件加載到"XML 設計器"中。

    2.從"XML"菜單選擇"驗證 Xml 數據"。

  這時,執行驗證操作。這一過程也同時檢查xml文檔的正確性,如果發現錯誤,狀態欄將予以指示。如果發生有效性錯誤,系統將提示"發現驗證錯誤"並在"任務列表"中提供詳細說明,否則,系統提示"未找到驗證錯誤"而通過驗證。

(轉貼自:http://developer.ccidnet.com/art/322/20030320/41111_1.html)

發佈了15 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章