–DTD不遵守XML语法(写XML文档实例时候用一种语法,写DTD的时候用另外一种语法)
–DTD数据类型有限(与数据库数据类型不一致)
–DTD不可扩展
–DTD不支持命名空间(命名冲突)
•Schema的新特性
–Schema基于XML语法
–Schema可以用能处理XML文档的工具处理
–Schema大大扩充了数据类型,可以自定义数据类型
–Schema支持元素的继承—Object-Oriented’
1. Schema(模式):其作用与dtd一样,也是用于验证XML文档的有效性,只不过它提供了比dtd更强大的功能和更细粒度的数据类型,另外Schema还可以自定义数据类型。此外,Schema也是一个XML文件,而dtd则不是。
schema的数据类型
2. 所有的schema文档,其根元素必须为schema。
Element
Group
attribute
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:simpleType name="myType"> <xs:list itemType="xs:date"/> </xs:simpleType> <xs:element name="name" type="xs:string" /> <xs:element name="author"> <xs:complexType> <xs:attribute name="male" use="required"/> </xs:complexType> </xs:element> <xs:element name="publish" type="myType"/> <xs:group name="book" > <xs:sequence > <xs:element ref="name" /> <xs:element ref="author"/> <xs:element ref="publish"/> </xs:sequence> </xs:group> <xs:element name="books" > <xs:complexType> <xs:sequence maxOccurs="unbounded"> <xs:group ref="book"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> <books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="sch.xsd"> <name /> <author male="ni"></author> <publish>2012-10-02</publish> <name /> <author male="ni"></author> <publish>2012-10-02</publish> </books>
SimpleType
作用:定义一个简单类型,它决定了元素和属性值的约束和相关信息•属性:name•内容:应用已经存在的简单类型,三种方式:–restrict→限定一个范围–list→从列表中选择–union→包含一个值的结合
1.子元素为:<xs:restriction>定义一个约束条件
<xs:simpleType name="freezeboilrangeInteger"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="100"/> </xs:restriction> </xs:simpleType>
2.子元素为:<xs:list>
从一个特定数据类型的集合中选择定义一个简单类型元素
<xs:simpleType name="listOfDates"> <xs:list itemType="xs:date“/> </xs:simpleType>
3子元素为:<xs:union>
从一个特定简单数据类型的集合中选择定义一个简单类型元素
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:attribute name="allframesize"> <xs:simpleType> <xs:union> <xs:simpleType> <xs:restriction base="roadbikesize"/> </xs:simpleType> <xs:simpleType> <xs:restriction base="mountainbikesize"/> </xs:simpleType> </xs:union> </xs:simpleType> </xs:attribute> <xs:simpleType name="roadbikesize"> <xs:restriction base="xs:positiveInteger"> <xs:enumeration value="46"/> <xs:enumeration value="52"/> <xs:enumeration value="55"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="mountainbikesize"> <xs:restriction base="xs:string"> <xs:enumeration value="small"/> <xs:enumeration value="medium"/> <xs:enumeration value="large"/> </xs:restriction> </xs:simpleType> </xs:schema>
3. SimpleType与ComplexType的区别:
1) SimpleType类型的元素没有子元素,也没有属性。
2) 当需要定义的元素包含了子元素或者属性时,必须要使用ComplexType。
3)当需要基于内置的基本数据类型定义一个新的数据类型时,用simpleType。
4. SimpleContent,用于ComplexType元素上,用于限定该ComplexType的内容类型,表示该ComplexType没有子元素,同时该ComplexType需要有属性,否则它就成为SimpleType了。
chioce
作用:允许唯一的一个元素从一个组中被选择
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="myType"> <xs:choice minOccurs="1" maxOccurs="1"> <xs:element name="apple" type="xs:string"/> <xs:element name="pear" type="xs:string"/> </xs:choice> </xs:complexType> <xs:element name="fruit" type="myType"/> </xs:schema>
Sequence
作用:给一组元素一个特定的序列
整体 而且有序,下面代码表示 elephant bear giraffe 都必须至少出现一次,且顺序不能颠倒。当elephant出现第二次的时候,bear giraffe也必须出现
<xs:element name="zooAnimals">
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="2">
<xs:element name="elephant"/>
<xs:element name="bear"/>
<xs:element name="giraffe"/>
</xs:sequence>
</xs:complexType>
</xs:element>
5. 通过DOCTYPE可以明确指定文档的根元素,因为DOCTYPE后面跟的元素就是文档的根元素;通过Schema是没法明确指定目标XML文档的根元素,XmlSpy是通过推断哪个元素包含了其他元素来选择包含其他元素最多的那个元素作为文档的根,但我们可以明确指定文档的根元素而不必按照XmlSpy的生成来做。
一个完整的schema文档
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/po.xsd" targetNamespace="http://tempuri.org/po.xsd"> <xs:element name="purchaSEOrder" type="PurchaSEOrderType"/> <xs:element name="comment" type="xs:string"/> <xs:complexType name="PurchaSEOrderType"> <xs:sequence> <xs:element name="shipTo" type="USAddress"/> <xs:element name="billTo" type="USAddress"/> <xs:element ref="comment" minOccurs="0"/> <xs:element name="items" type="Items"/> </xs:sequence> <xs:attribute name="orderDate" type="xs:date"/> </xs:complexType> <xs:complexType name="USAddress"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="street" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="state" type="xs:string"/> <xs:element name="zip" type="xs:decimal"/> </xs:sequence> <xs:attribute name="country" type="xs:NMTOKEN" fixed="US"/> </xs:complexType> <xs:complexType name="Items"> <xs:sequence> <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="productName" type="xs:string"/> <xs:element name="quantity"> <xs:simpleType> <xs:restriction base="xs:positiveInteger"> <xs:maxExclusive value="100"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="USPrice" type="xs:decimal"/> <xs:element ref="comment" minOccurs="0"/> <xs:element name="shipDate" type="xs:date" minOccurs="0"/> </xs:sequence> <xs:attribute name="partNum" type="SKU" use="required"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <!-- Stock Keeping Unit,a code for identifying products --> <xs:simpleType name="SKU"> <xs:restriction base="xs:integer"> <xs:minInclusive value="2"/> <xs:maxInclusive value="10"/> </xs:restriction> </xs:simpleType> </xs:schema>