[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > XML/WML > 正文
XML技術系列講座(12)驗証XML數據合法性(下)
本文出自:http://www.computerworld.com.cn 作者: 北京郵電大學 張劍 (2002-02-12 07:15:00)
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已經是大勢所趨,因此,筆者建議應學習並掌握這一技術。


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
XML技術系列講座(13)XML與電子商務 (2002-02-13 06:15:00)
XML技術系列講座(12)驗証XML數據合法性(下) (2002-02-12 07:15:00)
XML技術系列講座(11)驗証XLM數據合法性(上) (2002-02-12 06:15:00)
XML技術系列講座(10)客戶機與服務器的數據交互(下) (2002-02-11 07:15:00)
XML技術系列講座(9)客戶機與服務器的數據交互(上) (2002-02-11 06:15:00)
XML技術系列講座(8)通過DOM操作數據(下) (2002-02-10 07:20:01)
XML技術系列講座(7)通過DOM操作數據(上) (2002-02-09 07:20:00)
XML技術系列講座(6)XML與HTML的結合(下) (2002-02-08 07:15:00)
XML技術系列講座(5)XML與HTML的結合(上) (2002-02-08 06:15:00)
XML技術系列講座(4)XML的顯示XSL樣式單(下) (2002-02-07 07:15:01)

===更多相關===
 

★  樊強制作 歡迎分享  ★