posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          XML Schema 小結 轉

          Posted on 2008-10-22 17:11 semovy 閱讀(383) 評論(0)  編輯  收藏 所屬分類: XML相關
          為何需要XML Schema 
          在當今的IT行業中,XML被賦予了越來越多的職責和功能,例如,作為文本數據庫存儲數據,作為某一行業中數據交換的標準表示,等等。這些都需要相應的XML文件中對數據的描述,如數據類型、長度進行嚴格的定義,這樣才能真正做到數據的安全性和行業統一標準并有通用的規則對其進行解析。

          然而,XML在其產生的時候就被定義為高開放性,用文本方式瀏覽,用標簽來定義的標記語言,鑒于XML的這些特點,就像HTML文件一樣,XML文件本身無法對文件中的數據進行嚴格的定義。

          為了解決以上的矛盾,XML Schema應運而生了,它是用來定義XML文件的文本結構,數據類型等XML文件描述規則的。

          何為XML Schema 
          其實,XML Schema本身也是一個xml文件,所不同的是,Schema文件所描述的是對引用它的xml文件的element和attribute的具體類型的。作為一個Schema文件,其特殊的文件頭格式為:


          <?xml version="1.0"?>ß ------------------------------------------xml文件頭

          <Schema name="schema_sample_1" ß ------------------------ 名稱(可省略)

          xmlns="urn:schemas-microsoft-com:xml-data" ß --------- 引用微軟Schema類型定義(可省略)

          xmlns:dt="urn:schemas-microsoft-com:datatypes">ß -----引用微軟Schema數據類型定義(可省略)

          <!--…………..- 〉 ß ---------------------------------------------- 具體文件內容

          </Schema>


          必須注意的是,在一個定義Schema的xml文件中,文件的root一定為<Schema>…</Schema>,

          在文件的具體內容中,你可以添加你對某個xml結構、數據類型的定義,請看下例:


          <?xml version="1.0"?>

          <catalog>

          <book>

          <title>Presenting XML</title>

          <author>Richard Light</author>

          <pages>334</pages>

          </book>

          <book>

          <title>XML</title>

          <author>Jane Lee</author>

          <pages>450</pages>

          </book>

          </catalog>


          這是一個表示書目錄的xml文件,對每一本書的介紹,我們都要有一些數據上的規定,如,“書名”、“作者名”和“頁數”都應該是唯一的,“作者名”應該為字符串類型,而“頁數”應該為整數類型的,對每本“book”來說,只能有所指定的三個元素。


          為了能實現上述要求,我們定義了如下schema:


          <?xml version="1.0"?>

          <Schema>

          <ElementType name="title" content="textOnly" model="closed" />

          <ElementType name="author" content="textOnly" dt:type=”string” model="closed" />

          <ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

          <ElementType name="book" content="eltOnly" model="closed" order=”seq”>

          <element type="title" />

          <element type="author" />

          <element type="pages" /> 

          </ElementType>

          </Schema>


          在以下的文章中,將詳細的描述內容中的具體意義。

          ElementType 
          ElementType是schema中最基本的,它用來定義xml文件中元素的格式,數據類型等。

          定義一個ElementType的基本格式為:


          <ElementType

          content="{empty | textOnly | eltOnly | mixed}" 

          dt:type="datatype" 

          model="{open | closed}" 

          name="idref" 

          order="{one | seq | many}" >

          </ElementType>


          content 
          Content用于描述元素中的內容類型。 
          empty 
          元素內容為空 

          textOnly 
          元素只包含文本類型的內容 

          eltOnly 
          元素只包含元素類型的內容

          mixed 
          元素內容包含上述任何情況



          <ElementType name="x" content="empty"/>

          <ElementType name="x" content="textOnly"/>

          <ElementType name="x" content="eltOnly">

          <element type="y">

          </ElementType>

          <ElementType name="x" content="mixed">

          <element type='q'>

          <element type='r'>

          </ElementType>


           

          model 
          Model定義元素的內容是否要嚴格的遵守schema中的定義。 
          open 
          元素內容可添加未特殊定義過的元素,特征,文本等 

          closed 
          元素內容只能添加特殊定義過的元素,特征,文本等 



          <ElementType name="x" model="open"/>

          <ElementType name="y" model="close"/>


           

          name 
          定義該元素的名稱 
              


          <ElementType name="x"></ElementType> 

          order 
          定義該元素子元素的排列順序 
          one 
          只允許元素內容按一種方式排列 

          seq 
          允許元素內容按指定的方式排列 

          many 
          按任意方式排列 



          <ElementType name='z' order="one">

          <element type="x">

          <element type="y">

          </ElementType>

          <ElementType name="x" order="one">

          <group order="seq">

          <element type="x1">

          <element type="y1">

          </group>

          <group order="seq">

          <element type="x2">

          <element type="y2">

          </group>

          </ElementType>

          <ElementType name="x" content="eltOnly" order="many">

          <element type='q'>

          <element type='r'>

          </ElementType>

          特別注明,seq只元素內容可以按特殊列出的排列順序中任選一種。


          Dt:type 
          用于指定元素文本的數據類型 
          boolean 
          布爾型 

          char 
          字符型 

          date 
          日期型 

          Date time 
          日期時間型 

          Float 
          實型 

          Int 
          整型 

          Number 
          數字型 

          Time 
          時間型 

          Uri 
          Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9" 

          Uuid 
          例如"333C7BC4-460F-11D0-BC04-0080C7055A83". 

          entity
          xml補充類型 

          entities 
          xml補充類型 

          enumeration 
          xml補充類型 

          id 
          xml補充類型 

          idref 
          xml補充類型 

          idrefs 
          xml補充類型 

          nmtoken 
          xml補充類型 

          nmtokens 
          xml補充類型 

          notation 
          xml補充類型 

          string 
          字符串類型 



          <ElementType dt:type=”int”></Element>

          上表中只列舉了一部分常見數據類型,如果您想得到關于dt:type更詳細的信息,請瀏覽MSDN。


          除此之外,元素類型可以有另外一種方式,即引用一個已有的ElementType,請看下例:


          <ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

          <ElementType name="book" content="eltOnly" model="closed" order=”seq”>

          <element type="pages" /> 

          </ElementType>


          在元素book的定義中,為其定義了一個子元素,子元素的類型引用元素pages的定義。

           

          AttrributeType 
          Attribute也是xml的元素之一,用它可以表示Element中的某些特征,自然,我們也希望對attribute的數據結構和數據類型作定義。

          定義AttributeType的基本格式為


          <AttributeType

          default="default-value" 

          dt:type="primitive-type" 

          dt:values="enumerated-values" 

          name="idref" 

          required="{yes | no}" >


          default 
          設定attribute的默認值,必須注意的是,default的值也必須符合AttributeType中其他對數據結構的定義 



          Dt:type 
          用于指定Attribute的數據類型 
          boolean 
          布爾型 

          char 
          字符型 

          date 
          日期型 

          Date time 
          日期時間型 

          Float 
          實型 

          Int 
          整型 

          Number 
          數字型 

          Time 
          時間型 

          Uri 
          Universal Resource Identifier,如"urn:schemas-microsoft-com:Office9" 

          Uuid 
          例如"333C7BC4-460F-11D0-BC04-0080C7055A83". 

          entity 
          xml補充類型 

          entities 
          xml補充類型 

          enumeration 
          xml補充類型 

          id 
          xml補充類型 

          idref 
          xml補充類型 

          idrefs 
          xml補充類型 

          nmtoken 
          xml補充類型 

          nmtokens 
          xml補充類型 

          notation 
          xml補充類型 

          string
          字符串類型 



          <AttributeType dt:type=”int”>

          AttributeType的datatype類型與ElementType的datatype類型是相同的,上表中只列舉了一部分常見數據類型,如果您想得到關于dt:type更詳細的信息,請瀏覽MSDN。


          Dt:values 
          當dt:type為enumeration型時,定義attribute的可能值列表,attribute的值將在這些值中選取 



          <AttributeType name="colors" dt:type="enumeration"

          dt:values="red green blue">


           

          name 
          定義attribute的名稱 



          required 
          定義該attribute是否一定要包含在element中 
          yes 
          一定要包含 

          no 
          不一定要包含 



          AttributeType與ElementType一樣,也可以引用已有的AttributeType定義:

           

          description 
          description是一種注釋,用于說明Schema的定義內容。


          <ElementType name="Book">

          <description>

          This is how we describe the books we sell. Be sure to specify

          the ageGroup!

          </description>

          <element type="ageGroup">

          <default>ADULT</default>

          </element>

          </ElementType>

           

          group Element 
          group用來按一定序列,將element組織成group 

          group的表達形式為

          <group

          maxOccurs="{1 | *}" 

          minOccurs="{0 | 1}" 

          order="{one | seq | many}" >


          maxOccurs 
          定義該group出現的最多次數 

          只能調用一次 


          可以調用任意次 



          minOccurs 
          定義該group出現的最少次數 

          無要求 


          至少調用一次 



          order 
          定義該group中element的排列順序 
          one 
          只允許元素內容按一種方式排列 

          seq 
          允許元素內容按指定的方式排列 

          many 
          按任意方式排列 



           

          <ElementType name="x" order="one">

          <group order="seq">

          <element type="x1">

          <element type="y1">

          </group>

          <group order="seq">

          <element type="x2">

          <element type="y2">

          </group>

          </ElementType>

           

          Extensibility 
          Xml Schema時刻擴展的,他們建立在一個開放的內容模式上,在Schema文檔上可以任意的添加elemtnt和attribute,如下例,你可以利用其extensibility機制,對element “page”加以限制條件,由namespace “myEXT”擴展的tag,限制了書本的頁數必須在50至100頁之間。


          <ElementType name="pages" xmlns:myExt="urn:myschema-extensions">

          <datatype dt:type="int" />

          <myExt:min>50</myExt:min>

          <myExt:max>100</myExt:max>

          </ElementType>

           

          如何在XML文件中引用XML Schema 
          要在一個XML文件中引用一個Schema,只需在相應的element處注明,一般格式為:


          <”elementname” xmlns=” x-schema:[the url of the schema file]” >


          例如:


          <book xmlns="x-schema:http://www.microsoft.com/xml/schema/book.xml">

          <title>Presenting XML</title>

          <author>Richard Light</author>

          <pages>334</pages>

          </book>

           

          Schema 與 DTDs 
          在Schema之前,另有一種定義XML結構的方式,即DTDs,兩者的區別在于:


          1 XML Schemas是XML文檔,而DTDs有自己的特殊語法,這樣,你只需懂得XML的語法規則即可編寫Schema,無需學習其他語法規則;xml文件與xml schema文件可以用相同的語法分析器來解析,而無須寫兩套分析器;xml schema有強大、易用的擴展功能。


          2 XML Schema利用名域將文檔中特殊的節點與schema說明相聯系,一個xml文件可以有多個對應的schema,而用DTDs的話,一個xml文件只能由一個相對應的DTDs。


          3 XML schemas內容模型是開放的,可以隨意擴充,而DTDs將無法解析擴充的內容。


          4 DTDs只能把內容類型定義為一個字符串。而XML schemas允許你把內容類型定義為整型、浮點型、數據型、布爾型或者許多其他的簡單數據類型,而無須重定義。

           

          實例分析 
          現在我們來分析一下第二節中所舉的schema例子定義了什么:


          <?xml version="1.0"?>

          <Schema>

          <ElementType name="title" content="textOnly" model="closed" />

          <ElementType name="author" content="textOnly" dt:type=”string” model="closed" />

          <ElementType name="pages" content="textOnly" dt:type=”int” model="closed" />

          <ElementType name="book" content="eltOnly" model="closed" order=”seq”>

          <element type="title" />

          <element type="author" />

          <element type="pages" /> 

          </ElementType>

          </Schema>


          該schema文件定義了四種element type:

          title:只能有文本內容

          author:只能有文本內容,數據類型為字符串型

          pages:只能有文本內容,數據類型為整型

          book:只能包含子元素,并且子元素的排列順序必須按照schema所規定的順序

          book元素包含分別用,title,author,pages所定義的三個子元素。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泰兴市| 和田市| 南丹县| 西乡县| 翁牛特旗| 株洲县| 化州市| 锦屏县| 绵阳市| 福安市| 仙居县| 赣榆县| 天镇县| 天等县| 黄山市| 大埔县| 东乌珠穆沁旗| 建瓯市| 黄大仙区| 汪清县| 察雅县| 台中市| 英山县| 蓬安县| 塔城市| 天津市| 布拖县| 大邑县| 唐海县| 广西| 明星| 北辰区| 育儿| 吴堡县| 贵德县| 渝北区| 萍乡市| 凌源市| 石景山区| 自治县| 兴海县|