<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 閱讀(2027) 評論(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所存在的缺點,討論新型的更為強大的標準XML Schema。

    DTD的麻煩

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

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

    XML Schema不僅可以讓你定義XML文檔的結(jié)構(gòu)而且還允許你約束文檔的內(nèi)容,這就不同于DTD了。另外,一個 XML Schema自身就是一個XML文檔,其基于標簽的語法比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,很快你就會注意到它包含了標準的XML頭<?xml version = "1.0"?>,這表示schema自己就是一個XML文檔。而任何schema的根元素都必須是schema,它有一個或者多個說明自己的屬性。在這種情況下,schema的namespace定義屬性(xmlns)會定義名稱空間為xs,它將用作文檔中所有元素的根名稱空間。


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

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


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

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

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

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

    圖A

    簡單類型 定義

    string 字符串數(shù)據(jù)。

    boolean 二元類型的True或者False。

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

    dateTime 歷法日期和時間。

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

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

    integer 整數(shù)

    float 標準的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ù)雜類型只能包含命名屬性。


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

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

    Description又是怎么一回事呢?它出現(xiàn)在sequence元素內(nèi),有沒有這個必要呢?當然沒有。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一樣,標準的XML Schema定義非常多,你可以根據(jù)自己的需要在應(yīng)用程序的開發(fā)中采用。


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

    主站蜘蛛池模板: 一本色道久久88亚洲综合| 亚洲国产一区视频| 久久综合日韩亚洲精品色| 久青草视频97国内免费影视| 久久久久亚洲?V成人无码| japanese色国产在线看免费| 久久久久亚洲av成人无码电影| 日韩毛片免费一二三| 久久精品国产精品亚洲艾草网美妙| 污视频网站在线观看免费| 国产亚洲一区二区三区在线不卡| 美女被免费网站91色| 亚洲日韩中文字幕在线播放| 两性色午夜视频免费播放| 亚洲AV无码精品无码麻豆| 99热这里有免费国产精品| 67194在线午夜亚洲| 日本黄色免费观看| 一级做a爱过程免费视| 亚洲v高清理论电影| 免费A级毛片无码专区| 中文文字幕文字幕亚洲色| 又大又粗又爽a级毛片免费看| 无码日韩人妻AV一区免费l| 亚洲色自偷自拍另类小说| 亚洲香蕉免费有线视频| 亚洲AV综合色区无码一二三区 | 99热在线免费观看| 亚洲一区二区三区无码国产| 午夜男人一级毛片免费 | 久久久久国产精品免费免费不卡| 亚洲视频一区在线| 国产精品深夜福利免费观看| 插鸡网站在线播放免费观看| 亚洲国产精品日韩在线| 亚洲精品天堂成人片?V在线播放| 无码人妻丰满熟妇区免费| 亚洲色偷偷综合亚洲AV伊人蜜桃| 久久久精品国产亚洲成人满18免费网站| 久久免费视频99| 国产亚洲精品欧洲在线观看|