您的位置:首页 > 其它

[转]XML详解--Schema

2009-12-22 10:35 176 查看
有人会问,DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有Sche
ma呢。因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出
更细致的语义限制。其实细心的人会发现,在DTD中,只有一个数据类型,就是PCDATA(用
在元素中)和CDATA(用在属性中),在里面写日期也行,数字还行,字符更是没问题。而
Schema正是针对这些DTD的缺点而设计的,Schema是完全使用XML作为描述手段,具有很强
的描述能力,扩展能力和处理维护能力等。下面让我们看一个简单的例子吧:
hello.xml
-------------------
<?xml version="1.0"?><greeting>Hello World!!</greeting>

说明:
一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。

hello.xsd
----------
<?xml version="1.0"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <xsd:element name="greeting" type="xsd:string"/></xsd:schema>说明:
XML Schema文档后缀名是.xsd,完全符合XML语法,根元素是schema,命名空间xmlns:xsd
="http://www.w3.org/2001/XMLSchema,用元素<element>定义实例文档中的元素,如gre
eting。xsd:string就是定义的数据类型了,其中的数据类型有很多,比如:int,double,
dateTime,Boolean,long,integer,float,等,总之Java等语言里有的数据类型它都有,但
要以“xsd:”开头。
让我们再看一个里面有子无素的例子:
customer.xml
-----------  <customer>    <name>teiki</name>    <address>No.237, Road Waitan, Shanghai</address>  </customer>

则可以写出以下的XML Schema文档:
customer.xsd
---------------- 1: <?xml version="1.0"?>  2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">    3: <xsd:element name="customer">      4: <xsd:complexType>        5: <xsd:sequence>          6: <xsd:element name="name" type="xsd:string"/>          7: <xsd:element name="address" type="xsd:string" />          8: </xsd:sequence>        9: </xsd:complexType>      10: </xsd:element>    11: </xsd:schema>
说明:
实例文档customer.xml中,<customer>元素含有两个子元素,在Schema中凡是有两个以上
的子元素,就认为是复杂类型的,所以我们在Schema文档中采用ComplexType来定义该元素
。表示有多个XML子元素。
sequence表示子元素依次出现的顺序。
如果有多层子元素怎么办呢,同样的道理,有几层写几层,一直往下嵌就OK了,这里我要
说的是另一种方法,结构看上去会清晰一些。
address.xml
---------------
<customer>      <name>Teiki</name>      <address>        <!-- address追加一个地址子元素 -->        <prefecture>Zhejiang</prefecture>        <city>Hangzhou</city>        <street>Xilu Road, No.121, 7F</street>      </address>    </customer>下面就是采用ref元素来编写的这个Schema文档:
address2.xsd
----------------------    1: <?xm l version="1.0"?>    2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">      3:      4: <xsd:element name="customer">        5: <xsd:complexType>          6: <xsd:sequence>            7: <xsd:element name="name" type="xsd:string"/>            8: <xsd:element ref="address"/>            9: </xsd:sequence>          10: </xsd:complexType>        11: </xsd:element>      12:      13: <xsd:element name="address">        14: <xsd:complexType>          15: <xsd:sequence>            16: <xsd:element name="prefecture" type="xsd:string"/>            17: <xsd:element name="city" type="xsd:string" />            18: <xsd:element name="street" type="xsd:string" />            19: </xsd:sequence>          20: </xsd:complexType>        21: </xsd:element>      22:      23: </xsd:schema>
说明:
如果按正常的写法,应该把13-21行的内容替换到每8行去,但这里使用ref元素可以直接
将其指向另一个模块,使文档更加具有可读性。
如果元素中包含属性怎么办呢?一样简单,只要在定义完子元素的后面再着定义属性就行
了。定义属性用“attribute”,还是举个例子吧
customer2.xml
---------------    <customer id="001718">      <name>Teiki</name>      <address>No.237, Road Waitan, Shanghai</address>    </customer>
这个例子和上面的一个例子差不多,只是在元素customer中设了一个属性id。
customer2.xsd
------------------1: <?xml version="1.0"?>
2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">      3:      4: <xsd:element name="customer">        5: <xsd:complexType>          6: <xsd:sequence>            7: <xsd:element name="name" type="xsd:string"/>            8: <xsd:element name="address" type="xsd:string" />            9: </xsd:sequence>          10: <!-- 增加属性定义 -->          11: <xsd:attribute name="id" type="xsd:string"/>          12: </xsd:complexType>        13: </xsd:element>      14:      15: </xsd:schema>

说明:
需要注意的一点是,属性和元素不是一家的,所以要把它放在sequence外面写,但它们都
在customer的孩子,所以要写在complexType的里面。
下面再看一个例子:
order4-1.xsd
----------------------1:<?xml version="1.0"?>

2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">      3:      4: <xsd:element name="order">        5: <xsd:complexType>          6: <xsd:sequence>            7: <xsd:element ref="orderItem" maxOccurs="10"/>            8: </xsd:sequence>          9: </xsd:complexType>        10: </xsd:element>      11:      12: <xsd:element name="orderItem">        13: <xsd:complexType>          14: <xsd:sequence>            15: <xsd:choice>              16: <xsd:element name="id" type="idType"/>              17: <xsd:element name="name" type="xsd:string"/>              18: </xsd:choice>            19: <xsd:element name="quantity" type="quantityType"/>            20: </xsd:sequence>          21: </xsd:complexType>        22: </xsd:element>      23:      24: <xsd:simpleType name="idType">        25: <xsd:restriction base="xsd:string">          26: <xsd:enumeration value="7-5058-3496-7"/>          27: <xsd:enumeration value="7-5005-6450-3"/>          28: <xsd:enumeration value="7-3020-6069-7"/>          29: </xsd:restriction>        30: </xsd:simpleType>      31:      32: <xsd:simpleType name="quantityType">        33: <xsd:restriction base="xsd:integer">          34: <xsd:minInclusive value="1"/>          35: <xsd:maxInclusive value="10"/>          36: </xsd:restriction>        37: </xsd:simpleType>      38:      39: </xsd:schema>
上面的例子中,maxOccurs代表:相同元素最多出现的次数,与些相反的是minOccurs代表:
出现的最少次数。默认情况下两个都为“1”,如果把minOccurs设为“0”,表示该元素可
有可无。choice代表:可选的元素,也就是在这里面写的元素只能选其中之一,不能全写
。simpleType代表自定义数据类型,也就是name里的并不是真正的数据类型,而是根据自
己的意愿定制的。restriction代表对某一数据类型做约束,也就是只能取其中范围之内符
合要求的,比如第25-29行中,里面又有个元素enumeration代表枚举,也就是只能在枚举
的那几个中选一个,而下在的36-36行,里面又有一对元素minInclusive和maxInclusive
代表类型的取值范围,也就是只能取大于等于minInclusive并且小于等于maxInclusive的
数。
把这个Schema用在XML中是这样的:
<?xml version="1.0" encoding="UTF-8"?>    <order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="D:/ProgramCode/Year2/XML/practice/temp.xsd">      <orderItem>        <id>7-5005-6450-3</id>        <quantity>3</quantity>      </orderItem>      <orderItem>        <name>xyb</name>        <quantity>3</quantity>      </orderItem>      <!-- 注意下面这个是错的,因为超出了规定的范围 -->      <orderItem>        <id>7-5005-6450-3</id>        <quantity>13</quantity>      </orderItem>      <!? 从上面的注释到此,是错误的 -->    </order>
说明:
红色的部分是导入Schema的命令,绿色的是Schema文件的路径,如果用XMLSPY写时,会自
动加上。
对属性的设置,基本上和元素的差不多。比如:
<xsd:element name="orderItem">      <xsd:complexType>        <xsd:sequence></xsd:sequence>        <xsd:attribute name="id" type="idType" use="required"/>        <xsd:attribute name="quantity" type="xsd:integer" default="1"/>      </xsd:complexType>      <xsd:simpleType name="idType">        <xsd:restriction base="xsd:string">          <xsd:pattern value="/d{1}-/d{4}-/d{4}-/d{1}"/>        </xsd:restriction>      </xsd:simpleType>    </xsd:element>
这里我们讲id属性类型作为一种自定义数据类型idType。它的格式就是上面用到的也就是
类似于“7-5005-6450-3”样的。
而且,用attribute元素的use属性来定义是否是必须的属性。
required是必须值,optional是可选值,prohibited是无属性值。default属性是默认值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: