如何定义XSD并在XML中蒙特利尔公约使用中定义XSD

  和简单数据类型对应就是复雜数据类型了XML元素的数据类型可以是简单数据类型,也可以是复杂数据类型而XML属性的数据类型就只能是简单数据类型。这篇笔记就來学习一下XSD中的复杂数据类型了。

(1)和<simpleType>元素用来定义简单数据类型相对应可以蒙特利尔公约使用中定义<complexType>元素来定义复杂数据类型。其語法为:

 
是否为抽象的数据类型如为抽象的,则不能在XML文档中直接蒙特利尔公约使用中定义这种数据类型

是否为混合类型如果是混合類型,则允许同时出现字符数据和子元素

防止蒙特利尔公约使用中定义指定派生类型的复杂类型来替换当前定义的复杂类型
防止蒙特利尔公约使用中定义指定派生类型来派生新的类型
指定non-schema命名空间的任何其他属性

(2)复杂数据类型只能用于元素而不能用于属性进一步,可鉯根据能应用的元素对数据类型进行分类:

  • 简单数据类型:相应的元素内容是简单类型值并且元素不能有属性,蒙特利尔公约使用中定義<simpleType>定义

(3)在根元素<schema>下定义的复杂数据类型为全局的此时name属性是必须的,否则为局部的

(5)block属性指定不能蒙特利尔公约使用中定义指萣方式派生出来的类型来替换所定义的类型,可以取的值和final相同默认值为根元素<schema>的blockDefault属性值。

(1)在定义复杂数据类型时需要定义子元素和属性,那么怎么定义元素呢在XSD中,可以蒙特利尔公约使用中定义<element>元素来定义元素其语法如下:

 

其中element元素的各属性如下表:

新定义え素的名称,根元素<schema>下定义时为必须属性
对另一个元素的引用可包含一个命名空间前缀
可用来替代该元素的元素名称,必须具有相同的類型或从其派生类型
默认值元素内容是简单类型或textOnly时蒙特利尔公约使用中定义
固定值,元素内容是简单类型或textOnly时蒙特利尔公约使用中定義,默认值default和固定值fixed不能同时指定
在父元素中出现的最大次数非负整数或无限制(unbounded),默认值为1
在父元素中出现的最少次数必须小于或等于maxOccurs,默认值为1
是否可以将显示的零值分配给该元素默认为false,如果为true则在XML文档中可以设定该元素的nil属性为true
是否为抽象元素,如为抽象え素则不能直接在XML文档中蒙特利尔公约使用中定义
阻止蒙特利尔公约使用中定义指定派生方式的元素来替换当前元素
指定non-schema命名空间的任哬其他属性

(2)可以通过<group>元素将一组属性定义在一起,然后在其它需要元素的地方用元素组的引用就可以了语法如下:

 

这里涉及到了三種顺序指示器,用于定义元素的顺序:

  • all:子元素能以任意顺序出现但是每个子元素必须只出现一次,这个时候可以把minOccurs设置为0或1并且只能把maxOccurs设置为1
  • choice:子元素是互斥的关系,只能出现其中之一
  • sequence:子元素必须按照指定的顺序出现

  在某些情况下如果无法确定指定元素还需偠包含哪些子元素、哪些属性,这时候可蒙特利尔公约使用中定义通配符XSD中蒙特利尔公约使用中定义<any>元素作为元素通配符,表示任何元素即<any>元素出现的位置可以蒙特利尔公约使用中定义任何元素代替,其语法格式如下:

该元素最多可出现的次数
该元素最少可出现的次数
指定可代替该通配符的元素必须来自哪个空间
  • ##any:任意命名空间的元素
  • ##other:来自当前命名空间之外的其它任意命名空间的元素
  • ##local:无命名空间限萣的元素
  • 命名空间URI:指定命名空间的元素
  • 上面多个值的列表:值列表中的任意一个命名空间的元素
指定应用程序或XML处理器如何对替换元素進行验证
  • strict:XML处理器必须获得由namespace指定的命名空间对应的Schema并验证来自该命名空间的所有元素
  • lax:XML处理器尝试获取由namespace指定的命名空间对应的Schema,成功则验证所有元素否则也不报错
  • skip:XML处理器不会获取所需命名空间,也不会进行任何验证

XSD还提供了一种机制允许蒙特利尔公约使用中定義一个元素替换另一个元素,如果想定义某个元素可替换另一个元素可以为该元素增加substitutionGroup属性,其值就是该元素想替换的元素的名字蒙特利尔公约使用中定义元素替换需注意两点:

  • 替换元素和被替换元素必须以全局元素的形式来声明
  • 替换元素和被替换元素要么有相同的数據类型,要么替换元素类型是被替换元素类型的派生类型
  • 可以蒙特利尔公约使用中定义final属性来阻止自己被指定派生类型替换
  • 可以蒙特利尔公约使用中定义block属性来阻止指定派生类型的替换

  定义属性和定义元素是完全统一的只是定义属性蒙特利尔公约使用中定义<attribute>元素,其語法格式如下:

 
  • optional:属性是可选的并且可以具有指定数据类型的任意值
  • prohibited:不能蒙特利尔公约使用中定义属性(既然不能蒙特利尔公约使用Φ定义,为何还要定义主要是在派生新类型蒙特利尔公约使用中定义,用来删除原类型的某个属性)
 

  类似于元素通配符可以蒙特利尔公约使用中定义<anyAttribute>表示属性通配符,其语法格式如下:

其中属性含义与元素通配符<any>相同

4、再看看怎么派生复杂数据类型

  知道怎么萣义元素和属性之后,就可以进一步看怎么定义复杂数据类型了总的来说,定义复杂数据类型需要弄清两个问题:第一个问题是基类型嘚问题——定义复杂数据类型的基础是哪个类型第二个问题就是派生方式的问题——派生复杂数据类型可以蒙特利尔公约使用中定义限淛<restriction>和扩展<extension>两种方式。

  • anyType类型:和DTD中的ANY类似XSD中也有一个anyType类型,这种类型的元素没有任何限制可以包含子元素,可以包含字符串内容还可鉯添加任何属性(但这些属性需要在XSD文件中定义过),anyType类型是所有简单类型和所有复杂类型的基类型通常用于派生新的类型,而不是直接用来定义元素
  • 含简单内容的复杂类型:元素内容是简单类型值,但元素包括属性
  • 空元素类型:用于定义内容为空或空字符串的元素泹是该元素可以接受属性。定义空元素类型有两种方式:
    • 扩展长度为0的字符串:如果该元素不需要包含属性那么直接蒙特利尔公约使用Φ定义长度为0的字符串类型定义该元素即可
    • 限制anyTye:限制anyType时不定义任何子元素,只定义所需属性即可
<!--以空字符串为基础派生新的复杂类型--> <!--不指定子元素即定义了一个空元素-->

下面是我从这基类型和派生方式两个维度统计的一个列表:

定义时蒙特利尔公约使用中定义的XSD元素

anyType类型巳经没有任何限制了,所以也就不需要再扩展了

限制简单类型最终结果也是一个简单类型因此蒙特利尔公约使用中定义<simpleType>元素
可以通过添加属性或属性组派生复杂数据类型
包含简单内容的复杂类型 
  • 为元素内容增加进一步的约束
  • 为元素的属性类型增加进一步的约束
  • 对指定属性增加进一步的约束
  • 为原有类型增加属性:派生出来的新类型依然是空元素类型
  • 为原有类型增加子元素:派生出来的新类型将是包含子元素嘚类型
  • 为原有类型增加mixed="true":派生出来的新类型将是混合内容类型
  • 可以对指定属性的类型增加进一步约束
  • 可以对指定子元素的类型增加进一步約束
  • 为基类型增加新的子元素
 限制混合内容类型的方式和限制包含子元素的类型基本相同
 扩展混合内容类型的方式和扩展包含子元素的类型基本相同,但是必须保留mixed="true"

  派生类型的另外一种用法:

  定义元素还可以指定3种类型的约束:

  • key约束:相当于DB里面的主键约束要求指定内容必须存在而且唯一
  • keyref约束:相当于DB里面的外键约束,要求指定内容的值必须蒙特利尔公约使用中定义refer属性引用另一个key约束或unique约束
  • unique约束:相当于DB里面的唯一约束要求指定内容必须唯一,但可以不存在

  在DB中定义约束时不仅需要指定蒙特利尔公约使用中定义哪类约束,还需要定义应该对哪些字段应用约束在XSD中定义一致性约束也完全类似,也需要指定该约束将对哪些部分起作用因此需要在约束内蒙特利尔公约使用中定义如下两个子元素:

  • <selector>:需指定一个xpath属性,其值是一个XPath表达式用来确定一个元素范围,在一次约束定义中<selector>必须且呮能出现一次
  • <field>:需要指定一个xpath属性,其值是一个XPath表达式在一次约束定义中,<field>至少要出现一次也可以出现多次

这两个元素的含义是:在<selector>え素的XPath表达式表示的范围内,<field>元素的XPath表达式所表示的内容必须遵守一致性约束如果有多个<field>元素,则它们的XPath表达式内容的组合必须遵守一致性约束当XPath表达式所表示的内容无需遵守,这个概念相当于DB中的多列组合约束

最后看一下和DTD中对应的定义符号的用法,在XSD中蒙特利尔公约使用中定义<notation>元素定义符号用来标识XML文档中的外部数据,该元素可接受的属性有:

  • id:指定该符号的唯一标识通常无需指定
  • name:指定该苻号的名称,是一个必填属性而且该名称在整个XSD内必须是唯一的
  • public:指定该符号所标识数据的外部格式或对应处理程序,必填属性相当於DTD中<!NOTATION>中PUBLIC的作用
  • system:指定该符号所标识数据的外部格式或对应处理程序,可选属性相当于DTD中<!NOTATION>中SYSTEM的作用

我要回帖

更多关于 蒙特利尔公约使用中定义 的文章

 

随机推荐