Posted on 2006-03-23 22:01
fortune 閱讀(521)
評論(0) 編輯 收藏 所屬分類:
java技術
一、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架構文件:?
◇將Xml源文檔(.xml 文件)加載到"Xml設計器"中。?
◇從IDE菜單欄中選擇"XML"菜單項并單擊"創建架構"。?
就這么簡單,查看項目"所有文件",你會發現,與xml文檔同名的 XML 架構(.xsd 文件)生成了。?
不過,以這種方法產生xml架構時,所有數據類型都被默認設置為 xsd:string類型,因此,可能需要修改它們以符合 Xml文檔的需要。?
2、關聯xml文檔和xml架構文件?
如果已經創建了xml源文件和Xml架構文件,要使該xml架構文件對xml文檔發生作用,必須將xml源文件和xml架構文件關聯起來。在Visual Studio.Net IDE(集成開發環境)中,實現這一關聯非常簡單,通過定義Xml文件的targetSchema屬性就可以完成:?
◇將Xml 文件加載到"Xml 設計器"中。?
◇切換到"Xml"視圖模式。?
◇在屬性窗口中,從"targetSchema"屬性的下拉列表中選擇與名字空間相關聯的的架構文件。?
這時你應該會注意到,targetSchema屬性的下拉框將列出該項目包括的所有xml架構及一些建議的規范,包括相應的名字空間。這同時也告訴我們,如果所需要的xml架構并不包含在該項目中,你將需要在這里鍵入將用于驗證 XML 文檔的架構的統一資源標識符 (URI)。?
完成這幾步后,返回查看你的xml源文件,會發現,在根元素內,xml架構以默認名字空間被引用。?
附帶說明一下,清除targetSchema屬性的內容就可以移除xml文檔與xml架構間的關聯。?
3、執行驗證操作?
將xml架構文件與 Xml源文件關聯后,"Xml 設計器"的驗證功能可以檢查Xml文件是否有效:?
◇將要檢查的 XML 文件加載到"XML 設計器"中。?
◇從"XML"菜單選擇"驗證 Xml 數據"。?
這時,執行驗證操作。這一過程也同時檢查xml文檔的正確性,如果發現錯誤,狀態欄將予以指示。如果發生有效性錯誤,系統將提示"發現驗證錯誤"并在"任務列表"中提供詳細說明,否則,系統提示"未找到驗證錯誤"而通過驗證。?