Schema约束语法

本文记录Java学习过程中遇到的Schema约束语法~

XSDL(XML Schema定义语言)由元素、属性、命名空间和XML文档种的其他节点构成的。

XSD中的元素

XSD文档至少要包含:schema根元素和XML模式命名空间的定义、元素定义。

1.Schema根元素

语法如下:

<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
	子元素等内容
</xsd:schema>

在XSD中必须定义一个且只能定义一个schema根元素。根元素中包括模式的约束、XML模式命名空间的定义,其他命名空间的定义、版本信息、语言信息和其他一些属性。

2.元素

语法如下:

<xsd:element name=”user” type=”xsd:string” />

XSD中的元素是利用element标识符来声明的。其中name属性是元素的名字,type属性是元素值的类型,在这里可以是XML Schema中内置的数据类型或其他类型。

示例代码:

<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”user” type=”xsd:string” />
</xsd:schema>

以上文档对应的有效XML文档如下:

<?xml version=”1.0”?>
<user>string</user>

在元素的定义中还有2个属性:minOccurs和maxOccurs。其中minOccurs定义了该元素在父元素中出现的最少次数(默认为1,值为大于等于0的整数),maxOccurs定义了该元素在父元素中出现的最多次数(默认为1,值为大于等于0的整数)。在maxOccurs中可以把值设置为unbounded,表示对元素出现的最多次数没有限制。

示例代码:

<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema>
    <xsd:element name=”user” type=”xsd:string” minOccurs=”0” maxOccurs=”unbounded” />
</xsd:schema>

表示为元素user的类型为string,出现的次数最少为0(也就是可选),最多不限制。

3.引用元素和替代

语法如下:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”user” type=”xsd:string” />
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref=”user” />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

引用是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素,应当将经常使用的元素定义为根元素的子元素,以便在文档的任何地方引用它。

示例代码:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”yonghu” type=”xsd:string” substitutionGroup=”user” />
    <xsd:element name=”user” type=”xsd:string” />
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref=”user” />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

以上文档对应的有效XML文档如下:

<?xml version=”1.0”?>
<name>
    <user>string</user>
</name>

或者:

<?xml version=”1.0”?>
<name>
    <yonghu>string</yonghu>
</name>

主要是利用element标识符中的属性substitutionGroup实现的别名。

4.设置默认值和固定值

语法如下:

<xsd:element name=”city” type=”xsd:string” default=”xian” />
<xsd:element name=”country” type=”xsd:string” fixed=”china” />

通过default属性的设置,可以在XML文档中没有对city元素定义时赋予默认值。而使用fixed属性,可以给元素country设定一个固定的值china,并且不允许改变!

5.利用组合器控制结构

sequence组合器,定义了一列元素必须按照模式中指定的顺序显示(如果是可选的,也可以不显示)。语法如下:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name=”first” type=”xsd:string” />
                <xsd:element name=”middle” type=”xsd:string” />
                <xsd:element name=”last” type=”xsd:string” />
           </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

all组合器,允许所定义的元素可以按照任意顺序显示,all元素的子元素在默认情况下是必须的,而且每次最多显示一次。语法如下:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:all minOccurs=”0”>
                <xsd:element name=”first” type=”xsd:string” />
                <xsd:element name=”middle” type=”xsd:string” />
                <xsd:element name=”last” type=”xsd:string” />
            </xsd:all>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

choice组合器,允许指定多组声明中的一个,用于互斥情况。语法如下:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:choice>
                <xsd:element name=”first” type=”xsd:string” />
                <xsd:element name=”middle” type=”xsd:string” />
                <xsd:element name=”last” type=”xsd:string” />
            </xsd:choice>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

定义属性

在XML Schema文档中可以按照定义元素的方法定义属性,但受限制的程度较高。它们只能是简单类型,只能包含文本,且没有子属性。可以应用在attribute元素定义中的属性如下:

  • default:初始默认值;
  • fixed:不能修改和覆盖的属性固定值;
  • name:属性的名称;
  • ref:对前一个属性定义的引用;
  • type:该属性的XSD类型或者简单类型;
  • use:如何使用属性;
  • form:确定attributeFormDefault的本地值;
  • id;模式文档中属性唯一的ID。

default、fixed、name、ref和type属性与在element标记中定义的对应属性相同,但type只能是简单类型。Use属性的值可以是:optional(属性不是必须的,此为默认属性)、prohibited或者required(属性是强制的)。

创建属性

语法如下:

<xsd:attribute name=”age” type=”xsd:integer” />

该语句定义了一个名为age的属性,它的值必须是一个整数。把它添加到模式中时,它必须时schema元素、complexType元素或者attributeGroup元素的子元素。

示例代码:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
    <xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name=”first” type=”xsd:string” />
            </xsd:sequence>
            <xsd:attribute name=”age” type=”xsd:integer” use=”optional” />
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

以上代码对应有效的XML文档如下:

<?xml version=”1.0”?>
<name age=”27”>
    <first>string</first>
</name>

如上所示,要把属性附加在元素上,属性应该在complexType定义中的组合器之后定义或引用。

XML Schema数据类型

XML Schema提供了一组丰富的内置数据类型,用于定义元素中允许的类型,下面将介绍一些完全符合C#标准的通用类型。

1.基本数据类型

基本数据类型是在XML Schema中使用的每种数据类型的最基本构成块,可以根据这些类型构造自定义的类型。这些类型包括:

  • boolean:可以是1(true)或者0(false);
  • dateTime:表示时间的部分可选,格式:CCYY-MM-DDThh:mm:ss,例如:2005-3-18T14:48:12;
  • decimal:表示任意精度的十进制数字;
  • string:字符数据;
  • int:表示从-2,147,483,648到2,147,483,648之间一个整数;
  • nonNegativeInteger:表示大于或者等于0的一个整数;
  • nonPositiveInteger:表示小于或者等于0的一个整数;
  • short:表示从-32768到32767之间的一个整数。

示例代码:

<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema>
	<xsd:element name=”ContactDetails”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref=”name” />
                <xsd:element name=”rate” type=”xsd:decimal” />
            </xsd:sequence>
            <xsd:attribute name=”lastUpdated” type=”xsd:dateTime” />
        </xsd:complexType>
	</xsd:element>
	<xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name=”first” type=”xsd:string” />
                <xsd:element name=”middle” type=”xsd:string” />
                <xsd:element name=”last” type=”xsd:string” />
            </xsd:sequence>
            <xsd:attribute name=”local” type=”xsd:boolean” />
        </xsd:complexType>
	</xsd:element>
</xsd:schema>

以上文档对应有效的XML文档如下:

<?xml version=”1.0”?>
<ContactDetails lastUpdated=” 2005-3-18T14:48:12”>
	<name local=”true”>
    	<first>santld</first>
       	<middle/>
        <last>wang</last>
	</name>
	<rate>10.27</rate>
</ContactDetails>

2.简单类型 

虽然从内置数据类型中得到了许多的功能,但是在许多情况下,只有数据类型来限制数据的值是远远不够的。这里在学习简单类型之前,先看看约束,常见的约束有:

  • enumeration:用空格分开的一组指定的数值,它把数据类型约束为指定的值;
  • fractionDigit:指定小数点后的最大位数;
  • length:长度单位;
  • minExclusive:下限值,所有的值都必须大于该值;
  • maxExclusive:上限值,所有的值都应该小于该值;
  • minLength:长度单位的最小个数;
  • maxLength:长度单位的最大数;
  • minInclusive:最小值,所有的值都应该大于或者等于该值;
  • maxInclusive:最大值,所有的值都应该小于或者等于该值;
  • pattern:数据类型的值必须匹配的指定模式,pattern值必须是一个正则表达式;
  • totalDigits:指定小数最大位数的值;
  • whiteSpace:其值为:preserve(值中的空格不能改变),replace(所有的制表符、换行符和回车符都用空格代替),collapse(执行replace,删除相邻的、结尾处和开头处的空格)。

要应用上述的约束,就要利用元素restriction。这个元素中有2个属性:id属性是模式文档中restriction元素的唯一标识符,base属性设置为一个内置的XSD数据类型或者现有的简单类型定义,他是一种被限制的类型。

示例代码: 

<xsd:restriction base=”xsd:string”>
	<xsd:minLength value=”4” />
    <xsd:maxLength value=”10” />
</xsd:restriction>

如上,将字符串最小长度限定为4个字符,将最大长度限定为10个字符。

<xsd:restriction base=”xsd:int”>
	<xsd:minInclusive value=”1” />
	<xsd:maxInclusive value=”100” />
</xsd:restriction>

如上,将一个整数的取值范围设置为1到100之间。

<xsd:restriction base=”xsd:string”>
	<xsd:enumeration value=”FistValue” />
	<xsd:enumeration value=”SecondValue” />
	<xsd:enumeration value=”ThirdValue” />
</xsd:restriction>

如上,字符串只能为枚举出的三种值。

简单类型是对一个节点的可能值进一步限制的自定义数据类型。创建简单类型需要利用simpleType元素,其定义语法如下:

<simpleType id=”ID” name=”NCName” final=”(#all|(list|union|restriction))” />
  • id属性应唯一的标明文档内的simpleType元素;
  • name不能使用冒号字符;
  • simpleType不能包含元素,也不能有属性,根据在simpleType中定义的规则,它基本上是一个值,或者是一个值的集合。

示例代码: 

<xsd:simpleType name=”personsName”>
	<xsd:restriction base=”xsd:string”>
        <xsd:minLength value=”4” />
        <xsd:maxLength value=”8” />
	</xsd:restriction>
</xsd:simpleType>
<xsd:element name=”first” type=”personsName” />

以上文档对应有效的XML文档如下:

<first>Santld</first>

以上文档对应无效的XML文档如下:

<first>SS</first>
<first>Santld wang</first> 

3.复杂类型 

复杂类型的定义必须使用complexType元素,在这里可以包含属性和元素。在复杂类型的使用中,主要是complexType和simpleType配合使用。语法如下:

<xsd:complexType name=”name” />

示例代码:

<xsd:element name="name" type="FullName" />
<xsd:complexType name="FullName">
	<xsd:sequence>
		<xsd:element name="first" type="PersonsFirstname" minOccurs="0" maxOccurs="1" default="John" />
		<xsd:element name="middle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" nillable="true" />
		<xsd:element name="last" type="xsd:string" minOccurs="1" maxOccurs="1" default="Doe" />
	</xsd:sequence>
	<xsd:attribute name="title" type="PersonsTitle" default="Mr." />
</xsd:complexType>

<xsd:simpleType name="PersonsFirstname">
	<xsd:restriction base="xsd:string">
		<xsd:minLength value="4" />
		<xsd:maxLength value="10" />
	</xsd:restriction>
</xsd:simpleType>

<xsd:simpleType name="PersonsTitle">
	<xsd:restriction base="xsd:string">
		<xsd:enumeration value="Mr." />
		<xsd:enumeration value="Mrs." />
		<xsd:enumeration value="Miss." />
	</xsd:restriction>
</xsd:simpleType>

如上就实现了一个复杂类型,该例子实现了一个复杂类型FullName,其中包含了两个简单类型PersonsFirstname和PersonsTitle。

分组和属性

在为定义XML文档而创建的一些更为复杂的定义中,会有一些元素集、属性集的组合,这是我们就使用了分组的概念。分组定义中使用的是group元素。

定义语法如下:

<xsd:group name=”CityChoice”>
	<xsd:choice>
        <xsd:element name=” Beijing ” type=”xsd:string” />
        <xsd:element name=” Shanghai ” type=”xsd:string” />
        <xsd:element name=”Xian” type=”xsd:string” />
	</xsd:choice>
</xsd:group>

<xsd:element name=”City”>
	<xsd”group ref=”CityChoice” minOccurs=”1” maxOccurs=”1” />
</xsd:element>

对属性的分组,应该使用attributeGroup元素。

示例代码:

<xsd:attributeGroup name=”contactAttribs”>
	<xsd:attribute name=”city” type=”xsd:string” />
	<xsd:attribute name=”country” type=”xsd:string” />
	<xsd:attribute name=”age” type=”xsd:string” />
</xsd:attributeGroup>

<xsd:element name=”contact”>
	<xsd:complexType>
        <xsd:attributeGroup ref=”contactAttribs” />
	</xsd:complexType>
</xsd:element>

以上文档对应有效的XML文档如下:

<contact city=” Beijing ” country=” China ” age=”25” />

内容模型

内容模型可以对在XML文档内使用的元素、属性和类型进行限制,确定用户可以在XML实例的哪些等级添加自己的元素和属性。

  • any:当在XML中声明元素时any是默认的内容模型,该模型可以包含文本、元素和空格。如果允许添加元素的内容,且无需屋里修改模式文件,就可以使用该模型。

示例代码:

<xsd:xchema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
	<xsd:element name=”name”>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name=”first” type=”xsd:string” />
                <xsd:element name=”middle” type=”OtherNames” />
                <xsd:element name=”last” type=”xsd:string” />
            </xsd:sequence>
        </xsd:complexType>
	</xsd:element>
	<xsd:complexType name=”OtherNames”>
        <xsd:sequence>
            <xsd:any namespace=”##any” processContents=”lax” minOccurs=”0” maxOccurs=”unbounded” />
        </xsd:sequence>
	</xsd:complexType>
</xsd:schema>

例子中的xsd:any元素说明该类型允许添加内容。namespace属性允许的值为:

  • ##any(元素可以来自任何命名空间)
  • ##other(元素可以来自除了该元素的父元素所在的目标命名空间之外的命名空间)
  • ##local(元素不受命名空间的限制)
  • ##targetNamespace(元素来自父元素的目标命名空间)

processContents属性说明对这里所创建的元素进行验证时所执行的操作,取值有如下3种:

  • strict:标明XML处理器必须获得和那些命名空间相关联的模式,并验证元素和属性;
  • lax:与strict相似,只是如果处理器找不到模式文档,也不会出现错误;
  • skip:不利用模式文档验证XML文档。

上述模式的一个有效实例如下:

<?xml version=”1.0”?>
<name>
	<first>santld</first>
	<middle>
        <nameInChina>San</nameInChina>
	</middle>
	<last>wang</last>
</name>
  • empty:禁止把文本或者元素作为一个声明为空的元素的子元素,如果要保证该元素不包括子元素、文本甚至空格,就可以使用它。在XSD中时利用xsd:anyType类型来限定它的,这样就意味元素只能包含属性。

示例代码:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
	<xsd:element name=”contact”>
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:restriction base=”xsd:anyType”>
                    <xsd:attribute name=”age” type=”xsd:integer” />
                </xsd:restriction>
            </xsd:complexContent>
        </xsd:complexType>
	</xsd:element>
</xsd:schema>

以上就是一个复杂类型,只允许有一个age属性。在例子里complexContent元素可以表示complexType的内容要进行扩充或者限制,在这里,我们对其内容进行限制,因此使用了restriction元素,如果扩展则使用exension元素。

  • element:这个前面已经了解过了,不再赘述。
  • mixed:包含文本、内容和属性。在complexType元素上把mixed属性的值设为true,就一个声明一个mixed内容模型了。

示例代码:

<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
	<xsd:element name=”contact”>
        <xsd:complexType mixed=”true”>
            <xsd:sequence>
                <xsd:element name=”first” type=”xsd:string” />
            </xsd:sequence>
        <xsd:complexType>
	</xsd:element>
</xsd:schema>

上述模式的一个有效实例如下:

<?xml version=”1.0”?>
<contact>My first name is<first>Santld</first>.</contact>

在例子中contact元素就包含了文本和元素first。

标签: none