三、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>
再举个例子:
<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>
<xsd:element name=”title” type=”personstitle” />
上面定义的类型personstitle是一个字符串类型,但它的值只能是mr.、mrs.或者miss.其中的一个。
复杂类型
复杂类型的定义必须使用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
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
最后一个内容模型就是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。
(完)