XSD (Xml Schema Definition)

对着背影说爱祢 提交于 2021-02-13 13:58:51

知识源自于世界,我只是一个传递者;你帮我走过的路,我正在帮他走下去。


W3School有标准教程,网址:http://www.w3school.com.cn/schema/index.asp

下面,是本人的一些整理:

1.0、XML Schema(xsd) 是什么?

        XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

        实在不懂官方定义,可想成: xsd是交通法,xml是行人。

        xsd(交通法)规定了红停绿行,xml(行人)需遵守xsd(交通法)的规定。

        基本可以替代DTD。想要了解DTD,点击:http://www.w3school.com.cn/dtd/dtd_intro.asp


2.0、为什么要使用 XML Schema(xsd)?

        你也可以不用,然后你会发现要么编译不过,要么编译过了,运行出错。

        多数情况下的作用是一种校验。

        例: 

                甲、乙公司交互,约定格式传参格式为 <password>password</password>。

                甲方传<pwd>pwd</pwd>,如果没有xsd,等到交互时才发现失败。

                如果有xsd,在编写程序时,就告诉你<pwd>pwd</pwd>是错的,不符合xsd规定。


3.0、如何使用 XML Schema(xsd)

         3.1、<schema> 元素

        <schema> 元素是每一个 XML Schema 的根元素,可包含属性。 

    例1:

<?xml version="1.0"?>

<xs:schema>

...

</xs:schema>

        

    例2:

<?xml version="1.0"?>

<xs:schema 	

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

targetNamespace="http://www.w3school.com.cn"	

xmlns="http://www.w3school.com.cn"	

elementFormDefault="qualified">

...

</xs:schema>

   

    例1: 定义一个根元素。

    例2: 定义一个根元素,并做出相关定义。以下对各片段解释:

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

    显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。

    同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs


targetNamespace="http://www.w3school.com.cn"

    显示被此 schema 定义的元素来自命名空间: "http://www.w3school.com.cn"。


xmlns="http://www.w3school.com.cn"

    指出默认的命名空间是 "http://www.w3school.com.cn"。


elementFormDefault="qualified"

    指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。


         3.2、xsd元素-(简易元素)

    xxx-元素名称,yyy-元素类型。

 <xs:element name="xxx" type="yyy"/>  
 
 <xs:element name="color" type="xs:string" default="red"/>    --无值时,默认值为red 
 
 <xs:element name="color" type="xs:string" fixed="red"/>      --固定值为red,无法设置其他值。

    

    仅包含文本的元素,文本有很多类型。常用类型:

xs:string

xs:decimal

xs:integer

xs:boolean

xs:date

xs:time

    例:

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

<xs:element name="age"  type="xs:integer"/>

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


         3.3、xsd属性(简易类型)

    xxx-属性名称,yyy属性类型

<xs:attribute name="xxx" type="yyy"/>

<xs:attribute name="lang" type="xs:string" default="EN"/>      --default,无值时,默认为EN

<xs:attribute name="lang" type="xs:string" fixed="EN"/>        --fixed,固定值为EN,无法设置他值

<xs:attribute name="lang" type="xs:string" use="required"/>    --use,默认为可选,如要必选,可用


    例:

    带有属性的元素,

<xs:attribute name="lang" type="xs:string"/>


         3.4、xsd限定

            为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。一般有如下情况:


            a)、对值的限定

    定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120:

<xs:element name="age">    

    <xs:simpleType>   
     
        <xs:restriction base="xs:integer">   
           
            <xs:minInclusive value="0"/>  
              
            <xs:maxInclusive value="120"/>  
          
        </xs:restriction>  
    
    </xs:simpleType>

</xs:element>

           

             b)、对一组值的限定

    定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW:

<xs:element name="car">    

    <xs:simpleType>      
      
        <xs:restriction base="xs:string">   
                 
            <xs:enumeration value="Audi"/>    
                    
            <xs:enumeration value="Golf"/>   
                     
            <xs:enumeration value="BMW"/> 
                   
        </xs:restriction>    
        
    </xs:simpleType> 
   
</xs:element>

    或写成:

<xs:element name="car" type="carType"/>


<xs:simpleType name="carType">    

    <xs:restriction base="xs:string"> 
          
        <xs:enumeration value="Audi"/>  
              
        <xs:enumeration value="Golf"/> 
               
        <xs:enumeration value="BMW"/> 
           
    </xs:restriction>   
 
</xs:simpleType>

            

            c)、对一系列值的限定

            把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)

    定义了带有一个限定的名为 "letter" 的元素。此处类似于正则表达式,可以参考正则表达式,这里不举例。

<xs:element name="letter"> 
   
    <xs:simpleType>            

        <xs:restriction base="xs:string">  
                  
            <xs:pattern value="[a-z][A-Z][a-zA-Z][xyz]"/> 
                   
        </xs:restriction>      
      
    </xs:simpleType>  
  
</xs:element>

    

    定义了带有一个限定的名为 "prodid" 的元素。可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9:

<xs:element name="prodid">    

    <xs:simpleType>            

        <xs:restriction base="xs:integer">    
                
            <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>  
                  
        </xs:restriction>          
  
    </xs:simpleType>

</xs:element>


    定义了带有一个限定的名为 "gender" 的元素。可接受的值是 male 或者 female:

<xs:element name="gender">    

    <xs:simpleType>          
  
        <xs:restriction base="xs:string">    
                
            <xs:pattern value="male|female"/>  
                  
        </xs:restriction>   
         
    </xs:simpleType> 
   
</xs:element>


            d)、对空白字符的限定

    对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。

<xs:element name="address">    

    <xs:simpleType>        

        <xs:restriction base="xs:string">      
              
            <!--                 

            1、preserve, 不会移除任何空白字符   
                             
            2、replace,移除所有空白字符(换行、回车、空格以及制表符)    
                            
            3、collapse,将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格, 
                               
            开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格) 
                        
            -->            

            <xs:whiteSpace value="preserve"/>    
    
        </xs:restriction>    

    </xs:simpleType>

</xs:element>


            e)、对长度的限定

    如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。

<xs:element name="password">   
 
    <xs:simpleType>      
  
        <xs:restriction base="xs:string">  
                  
            <!--  
                      
            <xs:minLength value="5"/>    --最小为 5 个字符    
                    
            <xs:maxLength value="8"/>    --最大为 8 个字符 
                       
            -->            

            <xs:length value="8"/>   
     
        </xs:restriction>    

    </xs:simpleType>

</xs:element>


            f)、数据类型的限定

 
  限定                                描述 
  
  enumeration                    定义可接受值的一个列表
  
  fractionDigits                 定义所允许的最大的小数位数。必须大于等于0。
  
  length                         定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
  
  maxExclusive                   定义数值的上限。所允许的值必须小于此值。
  
  maxInclusive                   定义数值的上限。所允许的值必须小于或等于此值。
  
  maxLength                      定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
  
  minExclusive                   定义数值的下限。所允许的值必需大于此值。
  
  minInclusive                   定义数值的下限。所允许的值必需大于或等于此值。
  
  minLength                      定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
  
  pattern                        定义可接受的字符的精确序列。
  
  totalDigits                    定义所允许的阿拉伯数字的精确位数。必须大于0。
  
  whiteSpace                     定义空白字符(换行、回车、空格以及制表符)的处理方式。


         3.5、复合元素

    包含其他元素及/或属性的 XML 元素。

        a、空元素

    声明的元素,不能包含内容,只能含有属性

<xs:element name="product">    

    <xs:complexType>         
   
        <xs:complexContent>        
            
            <xs:restriction base="xs:integer">   
                         
                <xs:attribute name="prodid" type="xs:positiveInteger"/>     
                       
            </xs:restriction>       
             
        </xs:complexContent>    
        
    </xs:complexType>   
 
</xs:element>

    或写成:

<xs:element name="product">    

    <xs:complexType>        

        <xs:attribute name="prodid" type="xs:positiveInteger"/>   
 
    </xs:complexType>

</xs:element>

    或写成:

<xs:element name="product" type="prodtype"/>


<xs:complexType name="prodtype">    

    <xs:attribute name="prodid" type="xs:positiveInteger"/>    

</xs:complexType>


        b、仅含元素

    声明的元素只能包含其他元素。

<xs:element name="person">  
 
    <xs:complexType>    
    
        <!-- xs:sequence——意味着被定义的元素必须按上面的次序出现在 "person" 元素中 -->    
    
        <xs:sequence>  
              
            <xs:element name="firstname" type="xs:string"/>  
          
            <xs:element name="lastname" type="xs:string"/> 
       
        </xs:sequence>   
 
    </xs:complexType>

</xs:element>

    或写成:

<xs:element name="person" type="persontype"/>


<xs:complexType name="persontype">    

    <xs:sequence>        

        <xs:element name="firstname" type="xs:string"/>        

        <xs:element name="lastname" type="xs:string"/>    

    </xs:sequence>

</xs:complexType>


        c、仅含文本

    声明的元素可包含文本和属性,向此内容添加 simpleContent 元素。

    用 extension 或 restriction 元素来扩展或限制元素的基本简易类型。

    声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性:    

<xs:element name="shoesize">    

    <xs:complexType>            

        <xs:simpleContent>                    

            <xs:extension base="xs:integer">                            

                <xs:attribute name="country" type="xs:string" />                            

            </xs:extension>                    

        </xs:simpleContent>            

    </xs:complexType>    

</xs:element>

    或写成:

<xs:element name="shoesize" type="shoetype"/>


<xs:complexType name="shoetype">    

    <xs:simpleContent>            

        <xs:extension base="xs:integer">                    

            <xs:attribute name="country" type="xs:string" />                    

        </xs:extension>            

    </xs:simpleContent>    

</xs:complexType>


        d、包含混合内容

    声明的元素包含属性、元素以及文本。mixed 属性必须被设置为 "true"。

<xs:element name="letter">    

    <xs:complexType mixed="true">        

        <xs:sequence>            

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

            <xs:element name="orderid" type="xs:positiveInteger"/>            

            <xs:element name="shipdate" type="xs:date"/>        

        </xs:sequence>    

    </xs:complexType>

</xs:element>

    或写成:

<xs:element name="letter" type="lettertype"/>


<xs:complexType name="lettertype" mixed="true">    

    <xs:sequence>        

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

        <xs:element name="orderid" type="xs:positiveInteger"/>        

        <xs:element name="shipdate" type="xs:date"/>    

    </xs:sequence>

</xs:complexType>


         3.6、xsd指示器

            a)、Order 指示器:

            (1)、All

     指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:

<xs:element name="person">    

    <xs:complexType>        

        <xs:all>            

            <xs:element name="firstname" type="xs:string"/>            

            <xs:element name="lastname" type="xs:string"/>        

        </xs:all>    

    </xs:complexType>

</xs:element>

            

            (2)、Choice

    指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼)。

<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>


            (3)、Sequence

    规定子元素必须按照特定的顺序出现。

<xs:element name="person">    

    <xs:complexType>        

        <xs:sequence>            

            <xs:element name="firstname" type="xs:string"/>            

            <xs:element name="lastname" type="xs:string"/>        

        </xs:sequence>    

    </xs:complexType>

</xs:element>


            b)、Occurrence 指示器:

            maxOccurs 、minOccurs

    可规定某个元素可出现的最大次数。

<xs:element name="person">    

    <xs:complexType>        

        <xs:sequence>            

            <!-- unbounded--无上限 -->            

            <xs:element name="p_name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>

            <xs:element name="c_name" type="xs:string" maxOccurs="10"/> 

        </xs:sequence>    

    </xs:complexType>

</xs:element>

      

            c)、Group 指示器:

            (1)、元素组,必须在 group 声明内部定义一个 all、choice 或者 sequence 元素

<xs:group name="persongroup">  
  
    <xs:sequence>     
   
        <xs:element name="firstname" type="xs:string"/>    
    
        <xs:element name="lastname" type="xs:string"/>  
      
        <xs:element name="birthday" type="xs:date"/> 
   
    </xs:sequence>

</xs:group>


<xs:element name="person" type="personinfo"/>


<xs:complexType name="personinfo"> 
   
    <xs:sequence>        

        <xs:group ref="persongroup"/>      
  
        <xs:element name="country" type="xs:string"/>    

    </xs:sequence>

</xs:complexType>


            (2)、属性组

<xs:attributeGroup name="personattrgroup">    

    <xs:attribute name="firstname" type="xs:string"/>    

    <xs:attribute name="lastname" type="xs:string"/>    

    <xs:attribute name="birthday" type="xs:date"/>

</xs:attributeGroup>


<xs:element name="person">    

    <xs:complexType>        

        <xs:attributeGroup ref="personattrgroup"/>    

    </xs:complexType>

</xs:element>


         3.7、xsd <any> 、xsd <anyAttribute>

    一般在多个xsd之间引用对方时候,可以扩展用到。具体可以参考W3School。




注:源自于网络,仅供参考,其他部分拓展如元素替换、数据类型等可以参考W3School或自行搜索。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!