GB | BIG5
|
| 首頁 > 編程技術 > XML/WML > 正文 |
 |
| XML技術系列講座(12)驗証XML數據合法性(下) |
| 本文出自:http://www.computerworld.com.cn 作者: 北京郵電大學 張劍 (2002-02-12 07:15:00) |
|
<title>Straight Talk About Computers </title> |
|
<author>Lars Peterson</author> |
|
<title>You Can Comabt Computer Stress</title> |
|
<author>Lars Peterson</author> |
|
<author>Carlos Diaz</author> |
|
為上述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=“author” maxOccurs=“*” /> |
|
<ElementType name=“booklist” content=“eltOnly”> |
|
<element type=“book” minOccurs=“0” maxOccurs=“*” /> |
|
下面的這個例子中定義了“isbn”類型的屬性:數據類型是字符串,並規定如果元素中引用該屬性,那就必需賦值。 |
|
<AttributeType name=“isbn” |
|
<attribute type=“isbn” /> |
|
由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> |
|
其中本地的屬性定義只聲明了<price>元素為“float”類型,而通過名稱空間又引用了其他3個標簽來分別說明書籍的銷售稅、批量定額和折扣率。這種擴展性增強了Schema的靈活性。 |
|
我們還可以使用DOM技術來訪問擴展的Schema: |
|
<book isbn=“9-001-122-01”> |
|
<title>Straight Talk About Computers</title> |
|
假設上述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 |
|
在C/S(客戶機/服務器)環境中,客戶機和服務器都可以使用Schema來驗証文檔。在客戶機端驗証的對象可以是從服務器發來的文檔,也可以是即將發送出去的文檔。下面的這個例子就是用一個名為CustomerSchema.xml的Schema來驗証docSubmit的xml文檔,然發送給服務器: |
|
Set rootnode = docSubmit.documentElement |
|
rootnode.setAttribute “xmlns”, |
|
“x-schema:http://server/CustomerSchema.xml” |
|
DOM首先取得根元素的訪問權,然把xmlns設為Schema的地址,使之開始驗証。 |
|
相對客戶機而言,在服務器上進行驗証的意義更重大,在實際中也更為常見。由連接到服務器上的客戶數非常多,所以有必要在處理它們發送來的數據前,檢查收到的文檔是否與預期的結構一致。驗証步驟如下: |
|
Set docReceived = CreateObject(“Microsoft.XMLDOM”) |
|
docReceived.validateOnParse = True |
|
docReceived.async = False |
|
2.判斷是否鏈接XML Schema(只需檢驗一下根元素中是否設置了xmlns屬性): |
|
Set rootnode = docReceived.documentElement |
|
If rootnode.getAttribute(“xmlns”) = |
|
“x-schema:http://sever/CustomerSchema.xml” |
|
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.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)
|
===更多相關=== |
|
|
 |
★ 樊強制作 歡迎分享 ★ |