XML Schema所不能实现的

XML Schema所不能实现的

   本文不是带你走进XML Schema的世界,如果要学习XML Schema可以参考http://www.w3schools.com/schema/default.asp ,下面主要谈一下我在使用Schema时遇到的问题^o^如果有不对的地方欢迎指正哈^o^

   1、XML Schema不能通过某个属性的具体值来决定是否显示其它属性或子节点。如下XML文档,在Schema中将不能通过havaChild属性来控制childrenNums属性和<Child>子节点是否显示,如果havaChildfalse,则childrenNums属性和<Child>子节点没有意义,但在Schema定义的XML文档中仍然可以出现,Schema不能通过验证来避免这种情况的发生。

 1 <? xml version="1.0" ?>
 2 < Persons >
 3      < Person  name ="Ddpie"  havaChild ="true|false"  childrenNums ="2" >
 4          < Child >
 5              < Name > Tony </ Name >
 6              < Age > 12 </ Age >
 7          </ Child >
 8          < Child >
 9              < Name > Tom </ Name >
10              < Age > 15 </ Age >
11          </ Child >
12      </ Person >
13 </ Persons >
14


   2、 XML Schema 定义 XML 子节点的显示方式有 3 种:
 

all:所有定义的子节点都可以显示,注意这里用的是“可以”不是“必须”,你可以在具体的element中定义最小显示次数minOccurs是否为0来决定该节点是不是“必须”显示。但all这种显示方式要求minOccursmaxOccurs的值只能是0或者1,也就是说你想让某个节点重复出现,在all中是无法实现的。

choice:所有定义的子节点只能选择一个来进行显示,可以重复显示若干次,在minOccursmaxOccurs中定义最小和最大显示次数。

sequence:所有定义的子节点必须按Schema中定义的顺序来进行显示,每个节点可以重复若干次,在minOccursmaxOccurs中定义最小和最大显示次数。

   
    由于
Schema 只有这三种子节点显示方式,所以如果某个 XML 文档要求某个节点 < Person > 的子节点 < Child > < Friend > 不限制出现顺序和显示次数,在 Schema 中是无法定义的,如下 XML 文档在 Schema 是无法定义的:

 1 <? xml version="1.0" ?>
 2 < Persons >
 3      < Person  name ="Ddpie" >
 4          < Child >
 5              < Name > Tony </ Name >
 6              < Age > 12 </ Age >
 7          </ Child >
 8          < Friend >
 9              < Name > Lucy </ Name >
10              < Address > Beijing </ Address >
11          </ Friend >
12          < Child >
13              < Name > Tom </ Name >
14              < Age > 15 </ Age >
15          </ Child >
16          < Friend >
17              < Name > Stephen </ Name >
18              < Address > Shanghai </ Address >
19          </ Friend >
20      </ Person >
21 </ Persons >
22


   同时XML Schema对正则表达式的支持也不够完整,可能是W3C认为没必要全部支持,下面两点是它不支持的操作:

   3、不支持 不区分大小写匹配,如常用的 (?i),如果你要定义个节点 < Person havaChild= "True|False" / > 应该是下面的代码:

 1 < xsd:element  name ="Person" >
 2      < xsd:complexType >
 3          < xsd:attribute  name ="havaChild"  use ="required" >
 4              < xsd:simpleType >
 5                  < xsd:restriction  base ="xsd:string" >
 6                      < xsd:pattern  value ="True|False" />
 7                  </ xsd:restriction >
 8              </ xsd:simpleType >
 9          </ xsd:attribute >
10      </ xsd:complexType >
11 </ xsd:element >

   但是当你这样定义你的XML节点时 < Person havaChild= "true" / >就会出错了,因为它只能 区分大小写识别所定义的字符串,假如你还需要支持 < Person havaChild= "tRue" / >、<Person havaChild="truE"/>呢?由于XML Schema不支持“不区分大小写的字符串匹配”,所以只能这样做了:

 1 < xsd:element  name ="Person" >
 2      < xsd:complexType >
 3          < xsd:attribute  name ="havaChild"  use ="required" >
 4              < xsd:simpleType >
 5                  < xsd:restriction  base ="xsd:string" >
 6                      < xsd:pattern  value ="[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]" />
 7                  </ xsd:restriction >
 8              </ xsd:simpleType >
 9          </ xsd:attribute >
10      </ xsd:complexType >
11 </ xsd:element >


   4、不支持单词边界匹配,如常用的 \b和\B,所以如果需要匹配单词边界的话,只能在所要匹配的单词后面加上\s了,呵呵,没办法^o^

你可能感兴趣的:(XML Schema所不能实现的)