XML schema是W3C的推薦選擇,它提供了定義XML文件的結構,內容和語義的工具。與另外兩個schema建模工具文件類型定義(DTD)和XDR (XML Data Reduced)相比,XML schema具有兩個關鍵優勢。第一,由于它是針對定義XML數據結構的W3C官方推薦,所以公司組織都將采用同樣的定義。第二,它是最新的schema技術,因此它的建構就是要修正另外二者中存在的漏洞和缺陷,特別是在DTD之中的。
XDR并不是一個schema技術的備選方案,因為它只是微軟公司的XML schema規范的一個早期草稿。在.NET之中,XDR主要是為了向下兼容性而被支持。SQL Server 2000的XML擴展和微軟公司的COM parser (MSXML)仍然對其廣泛地使用。
我們開始先來看看XML schema對象模型是如何讓你使用.NET的類來操作schema部件的。然后,我們看一看處理schema信息的幾種途徑。
Schema背景 XML schema代表著XML類型系統并應在他們向其他應用軟件和平臺序列化他們的狀態時被用來描述類和對象。.NET XML schema對象模型(SOM)可以幫助在.NET-specific類型系統和XML schema類型系統之間建構一個橋梁,并使計劃性地創建和修改schema變得容易。Schema文件是一個帶有.xsd擴展名的XML文件。
所有可以在XML schema文件中使用的數據類型都有一個.NET的副本。一旦一個XSD schema被編譯為.NET表述(representation)對象模型,你就可以使用SOM類來訪問他們了。Schema編譯器將XSD裝配到一個XmlSchema對象之中,這個對象通過屬性和方式顯示了schema的信息。
在一個給定的平臺上,在XSD和一個合成二進制類之間的一個有效的序列化機制提供了巨大的潛力,它是實現完全的跨平臺互操作性的一個關鍵步驟。在.NET中,XML序列化是通過XmlSerializer類并利用XML schema定義工具(Xsd.exe)的服務來實現的。這個工具是.NET Framework SDK中的二進制可執行文件,你將會在.NET Framework安裝路徑中的BIN子目錄中找到它,這個路徑通常是C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK。
Xsd.exe可以從一個XSD文件中產生一個C# 或是Visual Basic類并從一個XML源文件中推斷出一個XML schema。這個工具還負責由Visual Studio .NET執行的XML中與schema相關的技術。
檢查SOM
.NET Framework提供一個類的等級來編輯現有的schema或是從頭開始創建一個新的schema。類在System.Xml.Schema名稱空間中被定義,名稱空間中的根類是XmlSchema。一旦應用軟件保留一個類的實例,他們就可以加載一個現有的XSD文件并利用所包含的信息構成內部屬性和集合,通過使用XmlSchema編程界面,你就可以加入或編輯元素,屬性和其他schema部件。最后,類提供一個Write方式,使你可以對有效的流對象保存目前的內容。
創建一個XmlSchema類的實例有兩個途徑:你可以使用缺省的建構器,它將返回一個新的空的類的實例,或者你也可以使用靜態的Read方式。
Read方式通過一個流,文本閱讀器或是XML閱讀器在可用的schema信息上運行,被返回的schema還沒有被編譯。Read方式接受一個second argument,它是一個驗證事件處理器。你可以將這個argument設置為空,但是不能在被讀取的schema之中找到并處理驗證錯誤。表A中顯示了如何使用.NET SOM來讀取和編譯一個schema。
一旦schema被編譯,你就可以訪問由post-schema有效性信息組所定義的schema的組成元素,要訪問schema中的實際類型,你需要使用SchemaTypes集合。
在編譯之前和之后的信息之間的不同點之一是,一個所含(不是事先被定義的)的合成類型只有在schema被編譯之后才會被查出。例如,假設你使用<xs:include>標簽來引入一個外部類型定義,要系統性地查找類型的存在,你必須首先對schema進行編譯。處理過程將對<include>聲明進行擴展并加入到類型定義之中。
在表B中的代碼顯示了在編譯之后如何得到在指定的schema中定義的合成類型的列表。
一旦schema被讀取至內存,你就可以自由地操縱它的結構,而間接標簽,例如<include>和<import>,只被識別為個體或單個對象。換句話說,他們只代表自己而不是他們要包括或是引入的內容。
應用軟件和內嵌schema
要讓客戶機應用軟件了解他們從服務器得到的XML數據的結構,schema信息是基礎。然而,schema信息也是一個額外的負擔,特別是在分布式應用軟件之中,它會占去一部分帶寬。
在一些情況下,你可以像對待Windows可執行文件中的調試信息那樣對待schema:在應用軟件的開發過程中不可或缺,而一旦應用軟件被發布就毫無用處。這個模式并不應用于所有的應用軟件,但是它形成了一個有趣的優化形式。一旦兩個互相通信的模塊對于一個XML格式達成一個,而在軟件中又是hard-coded,那么XML數據的格式怎么能夠以不同的方式進行交換呢?
當XML文件還沒有完全被有關的應用軟件所控制時,schema的確認就不再是一個可選擇的功能。可以想到的第一個方法就是讓客戶機應用軟件在本地存儲schema并在需要驗證引入的文件時對其進行加載。對于.NET應用軟件,XmlSchema.Read靜態方式就是你在加載現有schema文件時所需要的。另一個方法需要動態地創建并編譯一個schema對象,然后用它來驗證文件。XML驗證還提供另一個方式來確保這個文件處于所期望的形式。
結論 有了XML schema,你就可以以一種非常嚴格的形式來描述文件的版面設計,讓用戶不必再去空想。就像我們在這里看到的,XML schema對象模型使你能夠利用.NET Framework之中的schema支持。
|