Schema

Schema

XML Schema是基于XML的DTD替代者,用于描述XML文档的结构。XMLSchema支持命名空间,基本数据类型和复杂数据类型,比DTD更具优势。

1、       命名空间

一个XML文件可以包含多个XMLSchema文件,不同的schema文件难免会出现重名的元素。为了解决该问题,Schema提供了命名空间,只要在使用元素时加上命名空间,就可以避免不同schema元素重名的问题,如下

<!—sop.xsd -->

<?xml version="1.0" encoding="UTF-8"?>

<schema  xmlns="http://www.w3.org/2001/XMLSchema"

         targetNamespace="http://www.ssl.org/aop"

         xmlns:tns="http://www.ssl.org/aop"

         elementFormDefault="qualified">

        

         <element name="bean">

            <complexType>

                <sequence>

                    <element name="class"type="string"/>

                </sequence>

            </complexType>

         </element>

</schema>

<!—spring.xsd -->

<?xml version="1.0" encoding="UTF-8"?>

<schema  xmlns="http://www.w3.org/2001/XMLSchema"

         targetNamespace="http://www.ssl.com/spring"

         xmlns:tns="http://www.ssl.com/spring"

         elementFormDefault="qualified">

        

         <element name="bean">

              <complexType>

                  <sequence>

                      <element name="class"type="string"/>

                  </sequence>

              </complexType>

         </element>

</schema>

上面的aop.xsd、spring.xsd都定义了bean元素,若在同一个XML文件中使用上面两个schema定义的bean元素,此时需要在引入schema时添加命名空间,如下

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:spring="http://www.ssl.com/spring"

        xmlns:aop="http://www.ssl.com/aop"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.ssl.com/spring spring.xsd

        http://www.ssl.com/aop aop.xsd">

         

     <spring:bean>com.ssl.User</spring:bean>

     <aop:bean>com.ssl.Admin</aop:bean>

</beans>

可以在根元素的属性字段中,通过xmlns来引入schema文件,在引入schema文件时,可以通过xmlns:prefixName来指定命名空间的前缀,在使用该命名空间内的元素时,需要在元素前添加前缀。

在引入多个schema文件时,只有一个命名空间可以不添加前缀,该命名空间为默认命名空间

2、       Schema文件

新建Schema文件时,在根元素schema中总有如下属性:

<schema xmlns="http://www.w3.org/2001/XMLSchema"

        targetNamespace="http://www.ssl.com/person"

        xmlns:tns="http://www.ssl.com/person"

        elementFormDefault="qualified">

</schema>

(1)  其中http://www.w3.org/2001/XMLSchema为标准命名空间,该命名空间内定义了定义schema文件所用的元素和数据类型;

(2)  targetNamespace表明schema被xml引入的命名空间;

(3)  elementForDefault指出任何实例文档所使用本schema中声明的元素必须被命名空间限定;

3、       元素类型

在schema中可以使用的基本数据类型有int、interger、decimal、boolean、string、date、time。

在schema中,可以直接使用基本数据类型来声明简单元素类型,如下

<element name="id"   type="int"/>

<element name="name"type="string"/>

<element name="age"  type="int"/>

  也可以由简单元素组成复杂元素,任何复杂的元素类型都是由简单的元素类型组合而成的,如下

   <complexType name="user">

            <sequence>

               <element name="id"   type="int"/>

               <element name="name"type="string"/>

               <element name="age"  type="int"/>

            </sequence>

   </complexType>

复杂元素是由简单元素或其他复杂元素合成的,那么组合的规则是什么呢?在声明复杂元素时可以使用all、choice、sequence来嵌套子元素,以表明组合规则,具体如下

l  all

规定子元素可以按照任意顺序出现,但每个子元素只能出现一次;

l  chioce

规定可出现某个子元素或者另一个子元素,非此即彼,如下

    <xs:element name="person">

         <xs:complexType>

             <xs:choice>

                <xs:element name="employee"type="employee"/>

                <xs:element name="member"type="member"/>

            </xs:choice>

        </xs:complexType>

 </xs:element>

l  sequence

规定子元素必须按照特定的顺序出现,如下

        <element name="user">

           <complexType>

               <sequence>

                  <element name="id"   type="int"/>

                  <element name="name"type="string"/>

                  <element name="age"  type="int"/>

               </sequence>

           </complexType>

</element>

复杂元素是由简单元素或其他复杂元素合成的,那么组合的规则是什么呢?在声明复杂元素时可以使用all、choice、sequence来嵌套子元素,以表明组合规则,具体如下

此外,有些元素只允许出现一次,而有些元素可以出现多次;可以在choice、sequence、element等子元素上添加minOccurs和maxOccurs来指明允许元素出现的次数,如下

<?xml version="1.0" encoding="UTF-8"?>

<schema xmlns="http://www.w3.org/2001/XMLSchema"

        targetNamespace="http://www.ssl.com/books"

        xmlns:tns="http://www.ssl.com/books"

        elementFormDefault="qualified">

      <element name="books">

        <complexType>

             <sequence minOccurs="1" maxOccurs="unbounded">

                <element name="book">

                   <complexType>

                        <sequence>

                            <element name="id"     type="int"/>

                            <element name="name"   type="string"/>

                            <element name="author"type="string"/>

                        </sequence>

                   </complexType>

                </element>

             </sequence>

        </complexType>

     </element>

</schema>

4、       元素约束

在实际应用中,往往需要添加元素约束,如性别只能为男女,年龄范围,手机号、Emailed格式等。在schema中在定义元素时,可以添加元素约束,如可以添加范围、枚举、字符串长度、正则表达式等约束。在schema中只能为简单元素添加这些约束限制,如下

<?xml version="1.0" encoding="UTF-8"?>

<schema     xmlns="http://www.w3.org/2001/XMLSchema"

            targetNamespace="http://www.ssl.com/user"

            xmlns:tns="http://www.ssl.com/user"

            elementFormDefault="qualified">

        <element name="user">

           <complexType>

               <sequence>

                  <element name="id"     type="unsignedInt"/>

                  <element name="name"   type="tns:name"/>

                  <element name="age"    type="tns:age"/>

                  <element name="gender" type="tns:gender"/>

               </sequence>

           </complexType>

        </element>

       

        <simpleType name="age">

              <restriction base="int">

                 <minInclusive value="16"/>

                 <maxExclusive value="150"/>

              </restriction>

        </simpleType>

       

        <simpleType name="name">

            <restriction base="string">

                <minLength value="6"/>

                <maxLength value="18"/>

            </restriction>

        </simpleType>

       

        <simpleType name="gender">

            <restriction base="string">

               <enumeration value=""/>

               <enumeration value=""/>

            </restriction>

        </simpleType>

</schema>

5、       元素重用

在schema中定义元素,一般有3中方式,如下

l  嵌套型

嵌套型,只有一个根元素,所有子元素都嵌套在根元素内,层次清楚;但同一个schema中可能会有大量重复元素,而不能很好的重用,如下

<schema xmlns="http://www.w3.org/2001/XMLSchema"

        targetNamespace="http://www.ssl.com/books"

        xmlns:tns="http://www.ssl.com/books"

        elementFormDefault="qualified">

      <element name="books">

        <complexType>

             <sequence minOccurs="1"maxOccurs="unbounded">

                <element name="book">

                   <complexType>

                        <sequence>

                            <element name="id"     type="int"/>

                            <element name="name"   type="string"/>

                            <element name="author"type="string"/>

                        </sequence>

                   </complexType>

                </element>

             </sequence>

        </complexType>

     </element>

</schema>

l  嵌套型+直线型

为了尽量使schema文件层次清楚和重复使用元素,应先定义可能会被重用的数据类型,如下

<schema xmlns="http://www.w3.org/2001/XMLSchema"

        targetNamespace="http://www.ssl.com/books"

        xmlns:tns="http://www.ssl.com/books"

        elementFormDefault="qualified">

     

      <element name="books">

        <complexType>

             <sequence minOccurs="1"maxOccurs="unbounded">

                <element name="book"type="tns:book"/>

             </sequence>

        </complexType>

      </element>

    

      <complexType name="id">

           <sequence>

                <element name="id"type="unsignedInt"/>

           </sequence>

      </complexType>

     

      <complexType name="name">

           <sequence>

               <element name="name"type="string"/>

           </sequence>

      </complexType>

     

      <complexType name="author">

           <sequence>

                <element name="firstName"type="string"/>

                <element name="lastName"type="string"/>

           </sequence>

      </complexType>

     

      <complexType name="book">

          <sequence>

             <element name="id"type="tns:id"/>

             <element name="name"type="tns:name"/>

             <element name="author"type="tns:author"/>

          </sequence>

      </complexType>

</schema>

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值