XML Schema简介

来源:互联网 发布:python示例程序 编辑:程序博客网 时间:2024/06/05 20:05
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是不用加数量限制的,只有元素才有这个限制



原创粉丝点击