1、制定Schema 考慮如下XML文檔books.xml: <?xml version=“1.0”?> <booklist> <book> <title>Straight Talk About Computers </title> <author>Lars Peterson</author> </book> <book> <title>You Can Comabt Computer Stress</title> <author>Lars Peterson</author> <author>Carlos Diaz</author> </book> </booklist> 為上述XML文檔制定Schema時,可以先為<title>和<author>元素制定規則,用<ElementType>定義它們為只能包含字符串的文本元素: <ElementType name=“title” content=“textOnly” dt:type=“string” /> <ElementType name=“author” content=“textOnly” dt:type=“string” /> 然後說明<book>只能包含子元素,且子元素出現的順序是一定的。隨後在內部用<element>定義<book>包括一個<title>和任意個<author>子元素: <ElementType name=“book” content=“eltOnly” order=“seq”> <element type=“title” /> <element type=“author” maxOccurs=“*” /> </ElementType> 最後用同樣的方法說明根元素<booklist>: <ElementType name=“booklist” content=“eltOnly”> <element type=“book” minOccurs=“0” maxOccurs=“*” /> </ElementType> 下面的這個例子中定義了“isbn”類型的屬性:數據類型是字符串,並規定如果元素中引用該屬性,那麼就必需賦值。 <AttributeType name=“isbn” dt:type=“string” required=“yes” /> <ElementType name=“book” content=“eltOnly”> <attribute type=“isbn” /> </ElementType>
2、XML的可擴展性 由於XML Schema是一種內容開放的模型,這種可擴展性就意味著用戶可以在XML Schema中使用自己定義的元素和屬性。例如: <ElementType name=“price” xmlns:myExt=“urn:myextensions”dt:type=“float”> <myExt:salestax>17.5</myExt:salestax> <myExt:bulkbuy>20</myExt:bulkbuy> <myExt:discount>5.0</myExt:discount> </ElementType> 其中本地的屬性定義只聲明了<price>元素為“float”類型,而通過名稱空間又引用了其他3個標簽來分別說明書籍的銷售稅、批量定額和折扣率。這種擴展性增強了Schema的靈活性。 我們還可以使用DOM技術來訪問擴展的Schema: <book isbn=“9-001-122-01”> <title>Straight Talk About Computers</title> <price>19.99</price> </book> 假設上述XML數據就是根據剛才的Schema定義的,而且我們已經用DOM定位了<book>元素,那麼,接下來就可以訪問<price>節點,並利用它的definition屬性從Schema中得到<ElementType>的定義: Set priceNode = bookNode.selectSingleNode(“price”) Set priceElementTypeNode = priceNode.definition salestax = priceElementTypeNode.childNodes(0).text bulkbuy = priceElementTypeNode.childNodes(1).text discount = priceElementTypeNode.childNodes(2).text 這樣,就可以根據需要處理這些數據了。
3、在客戶機/服務器環境中驗證XML 在C/S(客戶機/服務器)環境中,客戶機和服務器都可以使用Schema來驗證文檔。在客戶機端驗證的對象可以是從服務器發來的文檔,也可以是即將發送出去的文檔。下面的這個例子就是用一個名為CustomerSchema.xml的Schema來驗證docSubmit的xml文檔,然後發送給服務器: Set rootnode = docSubmit.documentElement rootnode.setAttribute “xmlns”, “x-schema:http://server/CustomerSchema.xml” DOM首先取得根元素的訪問權,然後把xmlns設為Schema的地址,使之開始驗證。 相對客戶機而言,在服務器上進行驗證的意義更重大,在實際中也更為常見。由於連接到服務器上的客戶數非常多,所以有必要在處理它們發送來的數據前,檢查收到的文檔是否與預期的結構一致。驗證步驟如下: 1.將XML文檔載入DOM樹,開始驗證: Set docReceived = CreateObject(“Microsoft.XMLDOM”) docReceived.validateOnParse = True docReceived.async = False docReceived.load Request 2.判斷是否鏈接XML Schema(只需檢驗一下根元素中是否設置了xmlns屬性): Set rootnode = docReceived.documentElement If rootnode.getAttribute(“xmlns”) = “x-schema:http://sever/CustomerSchema.xml” Then 〈!--有,開始驗證!--〉 Else 〈!--沒有…… --〉 End If 3.如果沒有鏈接,服務器就要指定一個Schema進行鏈接,然後將更新的文檔重新裝入到另一個DOM樹中: path = Server.mapPath(“CustomerSchema.xml”) attr = “x-schema:” & path rootnode.setAttribute “xmlns”, attr Set docTested = CreateObject(“Microsoft.XMLDOM”) docTested.validateOnParse = True docTested.async = False docTested.loadXML docReceived.xml 由於XML Schema具有許多優秀的特性,國際上許多著名公司和大企業紛紛開始向Schema傾斜,比如微軟的IE 5.0就已經支持XML Schema。雖然Schema還需要在不斷的實踐中逐步完善,但XML Schema取代DTD已經是大勢所趨,因此,筆者建議應學習並掌握這一技術。