复杂类型

复杂类型

    复杂类型貌似在schema概述那章就介绍了,就是说一个元素如果带有属性或者包含子元素,就需要为该元素定义复杂类型。

复杂类型可以是命名的,也可以是匿名的。命名的复杂类型可以被多个元素所引用,他们总是在全局范围内被定义(父元素总是xs:schemaxs:redefine)匿名的复杂类型总是在元素声明内部定义,只能被该声明所引用。

一.从简单类型到复杂类型:

之前说过简单类型就是只含有字符数据,所以要想把简单类型转换成复杂类型就是在简单类型的基础上添加属性或者子元素。大家都知道,复杂类型要么具有简单内容,要么具有复杂内容。所以将简单类型转化为复杂类型就有两个方向,一个是向简单内容方向转化,也就是在原来基础上添加属性,schema中使用xs:simpleContent元素定义;一个就是向复杂内容方向转化,就是要至少添加子元素,使用xs:complexContent标签。

Ø  向简单内容方向转化模板:

永远不变的前两行省略

 <xs:element name=”XXX”>

<xs:complexType>

    <xs:simpleContent>

        <xs:extension bade=”xs:XXXXXX”>

           <xs:attribute name=”XXXX” type=”XXX”/>

        </xs:extension>

    </xs:simpleType>

</xs:complexType>

</xs:element>         

Ø 向复杂内容方向转化模板:

  <xs:complexType name=”XXXXX”>

<xs:complexContent>

<xs:restriction base=”XXXX”>basexs:anyType则此句和上一句可省略。

<xs:sequnence>

……

</xs:sequnence>

</xs:restriction>

</xs:complexContent>

</xs:complexType>

 

 

 

 

二.xs:attribute元素的usedefaultfixed属性:

use属性是用来规定该属性在实例文档中出现的必要性。它有三个属性:

Ø  optional  use属性的默认值,表示该属性是可选的。

Ø  prohibited 禁止出现

Ø  required  必须出现

对于全局声明的属性,不能使用use属性。

 
 

 

 

schema中可以通过default属性对该属性提供一个默认值,在实例文档中若没指定该属性,则该属性就使用默认值。所以若用default,则use属性是optional才有意义。若想让属性值固定下来,则可使用fixed提供一个默认值,若使用此属性,则use属性的值应是optional,若属性出现必须是fixed值指定的值。

三.anyType

anyType是派生所有简单和复杂类型的基类型,是他XML Schema中所有类型的祖先类型,它没有任何形式的约束。若声明成anyType,则可以是属性,可以是纯字符数据,可以是带有子元素的,都可以。不推荐使用。

四.纯元素内容:

纯元素内容就是该元素的内容只包含子元素,而没有字符数据,我们可以使用模型组来构建纯元素内容模型,模型组有三种:

Ø  sequence 表示序列,必须按指定顺序出现。

Ø  choice表示选择,该组中的所有子元素可以选择使用任意一个,且只能使用一个。

Ø  all表示任意次序,子元素可以以任意顺序出现。all组不能和其他的模型组(sequence组和choice组)一起使用,而且它必须出现在内容模型的顶部。

五.元素的出现指示符:

 有时同一个元素需要在实例文档中出现多次,因此需要使用通配符来限制元素的出现次数。我们可以通过minOccursmaxOccurs来限制,这两个属性可以在模型组元素或者xs:element上使用。

all组中生命的元素都不能出现超过一次。

全局声明的元素不能够包含minOccursmaxOccurs属性。

一.元素的默认值和固定值:

除了属性能有默认值外,元素也可以有默认值。元素的默认值使用xs:element元素的default属性来定义。需要注意的是:只有当元素在实例文档中出现且内容为空时,元素的值才等于声明中default属性的值;如果元素在实例文档中并不出现,模式处理器则根本不认为该元素出现。例:<format></format>或者<format/>此两种都为空。若需要强制指定一个属性则使用fixed属性,元素即使有值,也会使用默认值。

defaultfixed属性不能同时使用。

二.空元素:

即声明一个复杂类型,其中只有属性的声明。

三.混合内容:

如果一个元素既可以包含子元素,又可以包含字符数据,那么称元素的内容为混合的内容

例如

模式文档中,声明如下:

<xs:complextype name=”empType” mixed=”true”>

<xs:sequence>

<xs:element name=”name” type=”xs:token”/>

实例文档中,可以是如下的形式:

<employee>

    雇员:

    <name>张三</name>

四.元素组:

在模式定义时,默写元素可能作为多个元素的子元素使用,那么我们可以通过<xs:group>元素来声明,元素组中的元素应该声明为全局元素。

我们来看个例子:

<xs:group name=”empGroup”>

<xs:sequnence>

<xs:element name=”name” type=”xs:token”/>

<xs:element name=”age” type=”xs:positiveInteger”/>

</xs:sequnence>

</xs:group>

 

<xs:complexType name=”empType”>

<xs:sequnence>

<!--引用元素组-->

<xs:group ref=”empGroup”/>

xs:group元素中不能直接包含xs:element元素,必须使用模型组;并且xs:group元素本身和它内部的模型组都不能使用出现指示符,如果希望模型组的内容多次出现,则可在引用元素组时使用出现指示符。

十.属性组:

与元素组相对,可以使用attributeGroup元素来声明元素组。

需要注意的是,对属性组的引用必须在复杂类型定义最后。

十一. 通配符:

schema中有两类通配符:元素通配符和属性通配符。

1.元素通配符:

元素通配符使用xs:any元素作为占位符使用,它有4个属性:

Ø  minOccurs

Ø  maxOccurs

以上两个属性,不会限定子元素的出现次数。

Ø  namespace用于指定替换元素所属的名称空间,该属性的默认值为:##any,表明该替换元可以在任何的名称空间中,或者不在任何名称空间中。如果是##other,则表明替换元素可以在除模式文档目标名称空间之外的任何名称空间中,若模式文档没有目标名称空间,那么替换元素可以属于任何名称空间,且必须属于一个名称空间。

namespace还有其他三个值:

ü  ##targetNamespace:表明替换元素可以在模式文档的目标名称空间中。

ü  ##local:表明替换元素不在任何名称空间中。

ü  替换元素的特定名称空间:指出替换元素坐在的名称空间URI

 

Ø  processContents用于指示模式处理器如何对替换元素进行验证。

该属性的有效值如下:

²  strict这是默认值,模式处理器将查找与名称空间有关的模式文档,并验证来自这些名称空间的所有元素。如果找不到有关的模式文档,或者对替换元素验证失败,那么将引发错误。

²  lax strict类似,模式处理器会查找与名称空间有关的模式文档,并对来自这些名称空间的所有元素进行验证,若果验证失败,则报告错误,不同的是,如果模式处理器没有找到与名称空间有关的模式文档,则不会发生任何错误

²  skip模式文档不执行任何验证,而且也不会查找与名称空间有关的模式文档。不过替换元素仍然必须在namespace属性所允许的一个名称空间中。

2.属性通配符:

     与元素通配符类似,属性通配符可以让我们使用为生命的属性来扩展xml,我们可以使用xsanyAttribute元素来表示。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值