似水无痕 ^o^ 迪迪派

^o^ 努力学习 ^o^ 努力工作 ^o^ 努力养老婆 ^o^

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  5 随笔 :: 0 文章 :: 35 评论 :: 0 Trackbacks

   本文不是带你走进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^

posted on 2007-05-18 09:54 ddpie 阅读(4847) 评论(0)  编辑  收藏 所属分类: XML

只有注册用户登录后才能发表评论。


网站导航: