<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    FORTUNE

    THE WAY TO THE MASTER...
    posts - 49, comments - 18, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    XML Schema用法

    Posted on 2006-03-27 13:03 fortune 閱讀(2035) 評論(0)  編輯  收藏 所屬分類: java技術(shù)

    你現(xiàn)在應(yīng)該知道XML只說明數(shù)據(jù)的結(jié)構(gòu)而并不關(guān)心數(shù)據(jù)是如何具體描述的、數(shù)據(jù)是否正確。XML文檔的強制性結(jié)構(gòu)化需求是通過DTD(文檔類型說明)來實現(xiàn)的。那就是本系列文章中先前講述的主題。在本文里,我們概要介紹DTD所存在的缺點,討論新型的更為強大的標(biāo)準(zhǔn)XML Schema。

    DTD的麻煩

    使用DTD雖然在指定許可的元素、需要的元素以及給定XML文檔中如何組織元素等方面給我們以較大的方便,但是,一旦你想針對特定元素施加數(shù)據(jù)類型就會遇到麻煩了。DTD規(guī)范嚴(yán)格地定義了結(jié)構(gòu),但只支持相對功能較弱的內(nèi)容類型規(guī)范,而對強制性結(jié)構(gòu)化卻無計可施,比如名為Date 的數(shù)據(jù)如何規(guī)定它必須包含有效值呢?

    這就要指望XML Schema了,XML Schema目前作為建議已經(jīng)于2001年提交給了W3C ,這意味著它最終將成為一般用途的建議標(biāo)準(zhǔn)。假如你對此感興趣,你不妨到W3C網(wǎng)站找些官方文檔和內(nèi)容簡介之類的材料來看看。注意,其他schema定義也是有的,包括日本的標(biāo)準(zhǔn)RELAX 和微軟公司的XDR??墒?,XML Schema是唯一受到W3C成為的建議標(biāo)準(zhǔn),所以我在這篇文章中只對它進行闡述。

    XML Schema不僅可以讓你定義XML文檔的結(jié)構(gòu)而且還允許你約束文檔的內(nèi)容,這就不同于DTD了。另外,一個 XML Schema自身就是一個XML文檔,其基于標(biāo)簽的語法比DTD中的特殊字符要清楚多了。


    Schema概述

    XML Schema是用一套預(yù)先規(guī)定的XML元素和屬性創(chuàng)建的,這些元素和屬性定義了文檔的結(jié)構(gòu)和內(nèi)容模式。相應(yīng)的一套精巧的規(guī)則(這些規(guī)則卻很有意思的用DTD來表示)指定了每個Schema元素或者屬性的合法用途。如果違反這些規(guī)則解析器就會拒絕解析你的Schema以及任何同它相聯(lián)系的文檔。

    現(xiàn)在讓就讓我們來看看清單A中顯示的XML Schema示例,該例對我們以前在清單B中用到的圖書目錄進行了說明。清單B有了點小改動:作為根元素的catalog現(xiàn)在有了兩個新屬性,它們通過清單A中的catalog schema與之關(guān)聯(lián)。

    你再看catalog schema,很快你就會注意到它包含了標(biāo)準(zhǔn)的XML頭<?xml version = "1.0"?>,這表示schema自己就是一個XML文檔。而任何schema的根元素都必須是schema,它有一個或者多個說明自己的屬性。在這種情況下,schema的namespace定義屬性(xmlns)會定義名稱空間為xs,它將用作文檔中所有元素的根名稱空間。


    --------------------------------------------------------------------------------

    什么是名稱空間
    XML把名稱空間定義為包裝XML元素在一起供以后重用的方式。為了使用XML文檔的名稱空間中定義的元素,你必須通過xmlns屬性聲明你希望采用名稱空間。你還必須為該名稱空間定義快捷方式的前綴(例如xs:)作為你文檔中的根元素,從而使得名稱空間在文檔中都可用。前綴是用于文檔的任何導(dǎo)入名稱空間的元素的標(biāo)識符。這一過程就如同在Visual Basic中給庫加索引或者導(dǎo)入模塊;C++、Java或者.NET下的名稱空間也具有同樣的含義。


    --------------------------------------------------------------------------------

    我們的schema示例中接下來的元素是annotation,它的作用是代表同其父元素有關(guān)的文檔。annotation可以包含兩個子元素之一,或者是documentation或者是appinfo,或者兩者都包含進去。前者用于可讀的文檔,而后者則用來保存供應(yīng)用程序處理的指令。

    接下來我們定義了兩個主要的元素(根元素catalog及其子元素book),它們用在書目文檔內(nèi),后者采用了兩個element元素。這些元素都包含了定義名字的屬性和各個元素準(zhǔn)許的內(nèi)容。在這種情況下,catalog元素被定義為catalogtype類型,而book元素則被定義為elementtype類型;這兩種類型以后還要在schema文檔中被定義。

    什么是類型?
    我已經(jīng)說過了,XML Schema可以讓你把XML文檔中的元素聲明為特定的類型,準(zhǔn)許解析器檢查文檔的內(nèi)容及其結(jié)構(gòu)。XML Schem定義了兩種主要的數(shù)據(jù)類型:預(yù)定義簡單類型和復(fù)雜類型。這兩種數(shù)據(jù)類型之間的主要區(qū)別是復(fù)雜類型可以象數(shù)據(jù)一樣包含其他元素而簡單類型則只能包含數(shù)據(jù)。簡單類型給予了XML Schema低級類型檢查能力,允許你把元素定義為圖A中的任何類型之一。

    圖A

    簡單類型 定義

    string 字符串?dāng)?shù)據(jù)。

    boolean 二元類型的True或者False。

    date 歷法日期,格式是CCYY-MM-DD。

    dateTime 歷法日期和時間。

    time 24小時格式的時間可根據(jù)時區(qū)調(diào)節(jié)。

    decimal 任意精度和位數(shù)的十進制數(shù)。

    integer 整數(shù)

    float 標(biāo)準(zhǔn)的32位浮點數(shù)。


    XML Schema預(yù)定義簡單類型


    你也可以定義自己的簡單類型。為了更深入地了解各種XML Schema數(shù)據(jù)類型,請參看W3C網(wǎng)站上的“XML Schema Part 2: DataTypes”。

    復(fù)雜類型由complexType元素定義,它通常至少擁有一個name屬性,用在聲明其他元素時索引類型,除非它位于某一元素之內(nèi)(參見下一節(jié))。所有的復(fù)雜類型都會包含一個內(nèi)容定義類型,其主要功能是定義類型能包含的內(nèi)容模式。某些可用的內(nèi)容模式請見圖B。

    圖B

    復(fù)雜類型 定義

    sequence 在其定義范圍之內(nèi)的所有元素都必須按順序出現(xiàn),范圍由minOccurs和 maxOccurs指定。

    choice 其范圍內(nèi)有且只有一個元素必須出現(xiàn)。

    any 定義的任何元素都必須出現(xiàn)。

    simpleContent 這種復(fù)雜類型只包含了非嵌套元素??梢酝ㄟ^包含擴展元素的方式擴展先前定義的簡單類型。

    complexContent 這種復(fù)雜類型只能包含其他元素??梢酝ㄟ^包含擴展元素的方式擴展先前定義的復(fù)雜類型。

    attribute 這種復(fù)雜類型只能包含命名屬性。


    一些準(zhǔn)許的XML Schema復(fù)雜類型

    我們示例schema中的第一個complexType元素定義了booktype類型,你能從文檔注釋元素中看出,該類型給目錄中單一的書建模型。Booktype包含一個sequence元素,通過它告訴解析器這種復(fù)雜類型的元素必須按照同樣準(zhǔn)確的順序包含出現(xiàn)在sequence標(biāo)簽內(nèi)出現(xiàn)的所有元素。就booktype而言,元素author、title、genre、price和publish_date都必須出現(xiàn)在 booktype元素之內(nèi)。

    Description又是怎么一回事呢?它出現(xiàn)在sequence元素內(nèi),有沒有這個必要呢?當(dāng)然沒有。description元素有一個minOccurs屬性,它定義了復(fù)雜類型中元素可以出現(xiàn)的最小次數(shù)。在這種情況下,minOccurs的值是零,因此description是一個可選的元素。

    author元素也是這樣。它有一個maxOccurs屬性,但卻沒有設(shè)值,意思是說author元素可以在sequence中出現(xiàn)無限次,顯然,一本圖書的作者至少有一個但卻不一定只有一個。既沒有minOccurs也沒有maxOccurs屬性的元素必須而且僅僅只能在sequence中出現(xiàn)一次,因此,booktype sequence中的所有其他元素都是必要的而且只能出現(xiàn)一次。

    在我們的示例catalog schema中定義的第二個同時也是最后一個復(fù)雜類型是catalogtype復(fù)雜類型。它也是包含一個以上的sequence,你可以從無界的maxOccurs屬性看出這一點。

    深入解釋
    看你的背景知識有多少了,本文用到的示例schema的結(jié)構(gòu)對你來說要不本該如何要不只會叫你發(fā)昏,對book和catalog元素不采用正規(guī)復(fù)雜類型聲明來定義catalog schema也是可能的,清單C就是這樣。注意,清單C中的complexType元素嵌套在了element元素之內(nèi),catalog的sequence元素的子元素具有一個ref屬性通過它告訴解析器它有一個引用指向先前定義的book元素。

    我曾經(jīng)聽到很多人這樣問:“很好,如果是這樣的話,那么你為什么要采用以上那些費工夫的辦法呢?”很簡單,我們繞來饒去只是為了說明XML Schema的重要一點:它是可擴展的。通過定義類型的方式你就可以在多個文檔中重用它們,甚至還可以用不同的schema對其進行擴展,這就像你在開發(fā)應(yīng)用程序的時候重用或者擴展抽象數(shù)據(jù)類型或?qū)ο笫且粋€道理。


    工具

    到目前為止,你應(yīng)該意識到XML Schema的語法并不簡單。雖然可以用簡單的文本編輯器手工創(chuàng)建schema,不過,這樣做也許會叫你累得吐血。為了更好地利用它,你可以采用若干種XML工具,最近出現(xiàn)的一些工具甚至提供了創(chuàng)建XML Schema的圖形界面。XML Spy和Cape Clear Studio都是具有XML Schema創(chuàng)建功能的全方位XML綜合開發(fā)環(huán)境。dtd2xs是一種DTD-to-XML的Schema轉(zhuǎn)換工具,它有兩種形式:單獨運行的應(yīng)用程序和Java類。同DTD一樣,標(biāo)準(zhǔn)的XML Schema定義非常多,你可以根據(jù)自己的需要在應(yīng)用程序的開發(fā)中采用。


    結(jié)論
    XML Schema具有強制文檔內(nèi)容和結(jié)構(gòu)的能力,它是XML世界中的一種不但重要而且強大的新標(biāo)準(zhǔn)。在這篇文章里,我僅僅浮光掠影地大致解釋了其基本原理,但我希望這些闡述能給你打下一個繼續(xù)前進的基礎(chǔ)。

    主站蜘蛛池模板: 亚洲欧美成aⅴ人在线观看| 亚洲福利视频一区二区三区| 日韩亚洲人成在线| 久久久久久国产a免费观看黄色大片 | 国产成人高清精品免费观看| 亚洲AV无码不卡在线观看下载| 国产精品亚洲小说专区| 四虎永久在线精品免费观看地址| 国产精品亚洲精品日韩电影| 亚洲Av无码乱码在线观看性色| 黄网站色视频免费看无下截| 亚洲美女高清一区二区三区 | 91免费在线播放| 亚洲性色成人av天堂| 美女视频黄a视频全免费| 亚洲看片无码在线视频| 国产美女精品视频免费观看| 免费无毒a网站在线观看| 国产成人亚洲综合| 久久精品视频免费看| 亚洲av产在线精品亚洲第一站 | 国产精品免费观看久久| 亚洲AV无码一区二区三区久久精品| 亚洲?V乱码久久精品蜜桃| 成人自慰女黄网站免费大全| 久久久久亚洲av无码专区喷水| 久久WWW免费人成人片| 色多多A级毛片免费看| 亚洲AV永久纯肉无码精品动漫| 天天影视色香欲综合免费| 99亚洲乱人伦aⅴ精品| 精品亚洲综合在线第一区| 一二三四免费观看在线视频中文版| 风间由美在线亚洲一区| 丝袜熟女国偷自产中文字幕亚洲| 免费无码中文字幕A级毛片| 日韩亚洲国产综合高清| 中文字幕第一页亚洲| 嘿嘿嘿视频免费网站在线观看| 99亚洲精品卡2卡三卡4卡2卡| 黑人精品videos亚洲人|