XML Schema簡介

XML Schema是基於XML的,可以看作是DTD的替代,用於描述XML的結構,保證XML沒有被亂寫,意思一致。在Java的開發過程中,它有更加重要的作用。和JAXB結合使用,將數據的獲取方式對象化。因爲它也是XML編寫的,所以可擴展。你一旦寫了現成的Schema,那麼將來還可以重複使用(只要你寫得好)。

舉一個比較簡單的schema例子(省略了開頭)
<xs:element name="xxx" type="xs:string" default="dc">
</xs:element>

定義一個複合的元素,一般要指明是complexType,定義子元素的sequence

<xs:element name="employee">
     <xs:complexType>
         <xs:sequence>
              <xs:element name="firstname" type="xs:string"/>
              <xs:element name="lastname" type="xs:string"/>
         </xs:sequence>
    </xs:complexType>
</xs:element>

1.Schema元素

它是每一個XML Schema的根元素,它的屬性就是一些文件聲明,比如命名空間,JAXB的聲明之類的。

2.簡易元素

就是以<xs:element>包裝的,只有name和type的純文本的元素,不能有子元素,不能有屬性(注意,Schema裏面的子元素和屬性的包含是在xs:element標籤裏面添加新的xs:element或者xs:attribute標籤),比如
<xs:element name="xxx" type="xs:string" default="dc"></xs:element>
你可以添加限定,指定缺省值,也可以將值固定,但是不能再多,只能是一個元素名字,一個類型,然後可選的缺省值或者固定值。
通常的類型就是xs:string,xs:int等等,也可以自己定義

3.屬性
簡易元素是無法擁有屬性的,一旦某個元素擁有屬性,那麼它就會被當作某種ComplexType,而屬性自己是作爲簡易類型被聲明的。
定義屬性和定義簡單元素的方式是一樣的,比如
<xs.attribute name="lange" type="xs:string" default="EN" use="required" />
屬性的定義還可以加上restriction條件(facet),比如use,表明這個屬性是可選的還是必須的

4.如果你對一個element的類型,大小等等有限制的話,可以使用restriction,用來定義元素或者屬性可以接受的值
<xs:restriction base="xs:xxx">
   <xs:yyy></xs:yyy>
</restriction>
其中base是用來限定類型的,而<xs:yyy>是用來限定具體的表達,比如數值的大小,字母按照什麼樣的順序等等,這裏有很多發揮空間,也可以使用通配符。注意這個東西很有用,比如你要限制密碼長度,大小寫,很多東西都可以使用這個來進行配置。

關於restrictions有很多學問,可以做很多的限制,需要限制的時候查看一下文檔,然後再進行設置。

舉個例子,如果你在base裏面已經寫了int,那麼JAXB就不會再幫你生成新的type的類了,如果你使用這個type,只是會給你將裏面的元素設置爲int類型的。這一點稍微有點複雜,等下次用到了再說。
總之記住就是了,如果你定義的type加了restriction,限定爲string,那麼將來你在某個type中要是使用這個type的話,它只是一個string類型的變量,並不會通過JAXB生成專門的類。

5.發現一個問題,其實只有type可以被使用,而元素本身不能被使用,如果你想使用某個東西,可以使用SimpleType或者ComplexType來定義好,然後再在element裏面將其作爲type加進去。

6.複合元素
也就是一個元素包含了其它的元素或者屬性
一共有4種,1) 空元素,2) 包含其它元素的元素,3) 僅包含文本的元素,4) 包含元素和文本的元素,這些元素都可以包含屬性
也就是說,一旦簡單元素有了屬性或者內嵌元素,那麼它就是複合元素
怎麼定義呢?2種方法,一種是直接將某個元素聲明爲ComplexType,比如
<xs:element name="xxx">
     <xs:complexType>
           <xs:sequence>
               <xs:element         xxx           />
               <xs:element         yyy           />
           </xs:sequence>
     </xs:complexType>
</xs:element>
還有一種,可擴展性更好,就是單獨定義complexType,定義完了以後,元素想要引用直接就把element的類型聲明爲該type就行。這樣的話,一次定義,可以多次使用,而且定義和使用分離,便於維護。
除此之外,還可以使用extension,有效地利用已定義好的type。
     <xs:complexType name="xxx">
           <xs:sequence>
               <xs:element />
               <xs:element />
           </xs:sequence>
     </xs:complexType>

     <xs:complexType name="yyy">
       <xs:complexContent>      //它在這裏的作用主要是說明要限定或者拓展某個ComplexType的內容,比如加了restriction,比如添加了新的元素和屬性
         <xs:extension base="xxx">
           <xs:sequence>
               <xs:element />
               <xs:element />
           </xs:sequence>
         </xs:extentsion>
       </xs:complexContent>
     </xs:complexType>
還有一種可以混着寫的,需要使用在type後面加上 mixed="true",但是具體的等以後用到再說,有點複雜了。

7.指示器
一共有3類,加起來7種
第一類,Order指示器,用來定義元素的順序
a) All
意思就是元素可以按照任意順序出現,但是每個元素最多出現一次
b) Choice
意思就是非此即彼
c) Sequence
按照順序來
第二類,Occurence指示器,用來定義某個元素出現的頻率(次數),一定記住,只有元素有出現次數,屬性是沒有的
maxOccurs和minOccurs,元素最多和至少出現的次數
默認情況下,它們的值都是1。如果想讓某個元素出現的次數不受限制的話,那麼就加上maxOccur="unbounded"
第三類,Group指示器,用於定義相關的數批元素
其實沒什麼,相當於將元素或者屬性捆綁起來,將來引用的時候就可以一組一組的引用,咋用呢?
a) xs:group
b) xs:attributeGroup
要是你使用了group的話,必須在其內部定義一個all,choice,或者sequence的元素,需要引用的時候加一個
<xs:group ref="xxx" />就行了
attributeGroup一樣的道理

8.any和anyAttribute
用來擴展的,比如表明一下<xs:any minOccur="0" />,其實xs:any和xs:element是一樣級別的
anyAttribute和attribute是一樣級別的,但是attribute是不用加數量限制的,只有元素纔有這個限制



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章