跟我学XML Schema

来源:互联网 发布:淘宝销售属性什么意思 编辑:程序博客网 时间:2024/05/18 13:26
1.最简单的Schema文档
        如何写一个最简单的XML Schema文档呢?首先,我们写出一个最简单的XML文档。
hello.xml
1
2<?xml version="1.0"?> 
<greeting>Hello World!!</greeting> 
        一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。
hello.xsd
1
2
3
4<?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>定义实例文档中的元素,如greeting。
2.含子元素的稍复杂Schema文档
        假设实例文档是如下的:
customer.xml
1
2
3
4<customer> 
  <name>teiki</name> 
  <address>No.237, Road Waitan, Shanghai</address> 
</customer> 
        则可以写出以下的XML Schema文档:
customer.xsd
01
02
03
04
05
06
07
08
09
10
11<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="customer"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="name" type="xsd:string"/> 
        <xsd:element name="address" type="xsd:string" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        实例文档customer.xml中,<customer>元素含有两个子元素,所以我们在Schema文档中采用ComplexType来定义该元素。sequence表示子元素依次出现的顺序。
3.含子元素和孙元素的更复杂Schema文档
        这次我们给出一个更加复杂一些的文档:
address.xml
1
2
3
4
5
6
7
8
9<customer> 
  <name>Teiki</name> 
  <address> 
    <!-- address追加一个地址子元素 --> 
    <prefecture>Zhejiang</prefecture> 
    <city>Hangzhou</city> 
    <street>Xilu Road, No.121, 7F</street> 
  </address> 
</customer> 
        为此,我们需要一个更加复杂一点的Schema文档:
address.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="customer"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="name" type="xsd:string" /> 
        <!-- 追加子元素address--> 
        <xsd:element name="address"> 
          <xsd:complexType> 
            <xsd:sequence> 
              <xsd:element name="prefecture" type="xsd:string" /> 
              <xsd:element name="city" type="xsd:string" /> 
              <xsd:element name="street" type="xsd:string" /> 
            </xsd:sequence> 
          </xsd:complexType> 
        </xsd:element> 
        <!-- end --> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        不过,我们还可以采用ref元素来重新编写这个Schema文档:
address2.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="customer"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="name" type="xsd:string" /> 
        <xsd:element ref="address" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="address"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="prefecture" type="xsd:string" /> 
        <xsd:element name="city" type="xsd:string" /> 
        <xsd:element name="street" type="xsd:string" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        使用ref元素可以直接将其指向另一个模块,使文档更加具有可读性。
4.如何定义属性呢?
        加入实例文档的元素包含属性,怎么办呢?
customer2.xml
1
2
3
4<customer id="001718"> 
  <name>Teiki</name> 
  <address>No.237, Road Waitan, Shanghai</address> 
</customer> 
        那就这样写Schema文档:
customer2.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="customer"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="name" type="xsd:string" /> 
        <xsd:element name="address" type="xsd:string" /> 
      </xsd:sequence> 
      <!-- 增加属性定义 --> 
      <xsd:attribute name="id" type="xsd:string" /> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        很简单,在<sequence>元素定义完成后,再用<attribute>元素id。
5.如何定义相同子元素的数量?
        先看这个简单的订购数据实例文档:
order.xml
1
2
3
4<order> 
  <orderItem>Accounting Book</orderItem> 
  <orderItem>Taxation Book</orderItem> 
</order> 
        假设<orderItem>元素,即每次的订购书目不能超过10种,那该怎么写这个Schema文档呢?这里要用到<element>的maxOccurs属性。
order.xsd
01
02
03
04
05
06
07
08
09
10<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="orderItem" type="xsd:string" maxOccurs="10" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        第7行中的maxOccurs属性为10,代表orderItem元素可以最大有10个。如果,不设定元素个数,则可以用maxOccurs="unbounded"来定义。类似,如果要定义最小值,可以使用minOccurs,比如下面这句:
1<xsd:element name="orderItem" type="xsd:string" minOccurs="5" maxOccurs="10"/> 
        这两个属性缺省值都是1。
6.如何定义可选项的子元素?
        假如上面的订书数据中,可以用书名或者书号任一一种订购,则实例文档可能如下:
order2.xml
01
02
03
04
05
06
07
08
09
10<order> 
  <orderItem> 
    <!--书名订购--> 
    <name>Accounting Book</name> 
  </orderItem> 
  <orderItem> 
    <!--书号订购--> 
    <id>7-5058-3496-7</id> 
  </orderItem> 
</order> 
        这时书写Schema文档还需要使用choice元素。
order2.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element ref="orderItem" maxOccurs="10" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="orderItem"> 
    <xsd:complexType> 
      <xsd:choice> 
        <xsd:element name="name" type="xsd:string" /> 
        <xsd:element name="id" type="xsd:string" /> 
      </xsd:choice> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
7.稍微更复杂的可选项子元素
        再稍微修改一下订书数据的实例文档:
order3.xml
1
2
3
4
5
6
7
8
9<order> 
  <orderItem> 
    <name>Accounting Book</name> 
    <quantity>2</quantity> 
  </orderItem> 
  <orderItem> 
    <id>7-5058-3496-7</id> 
  </orderItem> 
</order> 
        这里假定<quantity>值为1时,缺省。如何修改Schema文档呢?
order3.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element ref="orderItem" maxOccurs="10"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="orderItem"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:choice> 
          <xsd:element name="name" type="xsd:string"/> 
          <xsd:element name="id" type="xsd:string"/> 
        </xsd:choice> 
        <xsd:element name="quantity" type="xsd:string" minOccurs="0"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
</xsd:schema> 
        19行中的quantity最少出现值为0,也就是可以有,也可以没有。当然,也可以直接在<choice>元素中,包含quantity,然后定义它的minOccurs。
8.内置简单类型
        内建于XML Schema的简单类型有44种。他们在XML Schema推荐标准的第二部分中公布,下面这是一张内置类型的层次结构图:

9.自定义简单类型
        如果内置简单类型的44种还不能满足要求,怎么办呢?下面学习自定义简单类型。(XML的扩展性充分体现在这里)例如这个实例文档:
order4.xml
1
2
3
4
5
6<order> 
  <orderItem> 
    <id>7-5058-3496-7</id> 
    <quantity>5</quantity> 
  </orderItem> 
</order> 
        ID是一个标准的ISBN编码,我们怎么定义这个ISBN编码呢?
1
2
3
4
5<xsd:simpleType name="idType"> 
  <xsd:restriction base="xsd:string"> 
    <xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/> 
  </xsd:restriction> 
</xsd:simpleType> 
        idType是一个自定义的简单类型。我们对它做了限制:<xsd:restriction base="xsd:string">代表它是基于一个字符串类型。再用pattern元素来描述该字符串的形式。value="\d{1}-\d{4}-\d{4}-\d{1}"这是一个正则表达式,关于正则表达式,以后再介绍。嘻嘻!
        利用这个自定义的简单类型,我们可以重新写Schema文档:
order4.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element ref="orderItem" maxOccurs="10"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="orderItem"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="id" type="idType"/> 
        <xsd:element name="quantity" type="xsd:integer"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <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:schema> 
        假如我们事先确定好ID只有3个,即只有3个ISBN是可选的,那怎么办?我们可以用enumeration元素来进行列举。
1
2
3
4
5
6
7<xsd:simpleType name="idType"> 
  <xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="7-5058-3496-7"/> 
    <xsd:enumeration value="7-5005-6450-3"/> 
    <xsd:enumeration value="7-3020-6069-7"/> 
  </xsd:restriction> 
</xsd:simpleType> 
        再来看订购量quantity的值,如果我们设定其值必须在1-10之间,该怎么办呢?可以这些自定义一个简单类型。
1
2
3
4
5
6<xsd:simpleType name="quantityType"> 
  <xsd:restriction base="xsd:integer"> 
    <xsd:minInclusive value="1"/> 
    <xsd:maxInclusive value="10"/> 
  </xsd:restriction> 
</xsd:simpleType> 
        其中,minInclusive,maxInclusive分别代表该类型的取值范围。所以最终修改后的Schema文档如下:
order4-1.xsd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element ref="orderItem" maxOccurs="10"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="orderItem"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element name="id" type="idType"/> 
        <xsd:element name="quantity" type="quantityType"/> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:simpleType name="idType"> 
    <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="7-5058-3496-7"/> 
    <xsd:enumeration value="7-5005-6450-3"/> 
    <xsd:enumeration value="7-3020-6069-7"/> 
    </xsd:restriction> 
  </xsd:simpleType> 
  <xsd:simpleType name="quantityType"> 
    <xsd:restriction base="xsd:integer"> 
      <xsd:minInclusive value="1"/> 
      <xsd:maxInclusive value="10"/> 
    </xsd:restriction> 
  </xsd:simpleType> 
</xsd:schema> 
10.定义属性
        最后,我们再来讲讲元素的属性如何在Schema文档中定义。比如上面的order.xml实例文档中:
1
2
3<order> 
  <orderItem id="7-5058-3496-7" /> 
</order> 
        对此,我们在Schema文档中采用一个attribute来定义:
order.xsd
1
2
3
4
5
6
7
8
9<xsd:element name="orderItem"> 
  <xsd:complexType> 
    <xsd:sequence>   
      <!--空元素--> 
    </xsd:sequence>      
    <!--定义该元素属性--> 
    <xsd:attribute name="id" type="xsd:string"/> 
  </xsd:complexType> 
</xsd:element> 
        那么,实例文档中该属性值是必须的还是可有可无的呢?我们可以这样限制:
1<xsd:attribute name="id" type="idType" use="required"/> 
        这里我们讲id属性类型作为一种自定义数据类型idType。而且,用attribute元素的use属性来定义是否是必须的属性。required是必须值,optional是可选值,prohibited是无属性值。那么对于属性的缺省值,我们怎么定义呢?比如:
1
2
3<order> 
  <orderItem id="4-8443-1780-6" quantity="3"/> 
</order> 
        我们还可以用attribute元素的另一个属性default来定义:
1<xsd:attribute name="quantity" type="xsd:integer" default="1"/> 
        所以,我们可以重新写出一个Schema文档:
order2.xsd
1
2
3
4
5
6
7<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:element> 
        上面的属性我们定义我们还可以采用属性组的办法来重新改写Schema文档。
order3.xsd
01
02
03
04
05
06
07
08
09
10<xsd:element name="orderItem"> 
  <xsd:complexType> 
    <xsd:sequence></xsd:sequence> 
    <xsd:attributeGroup ref="orderItemAttributes" /> 
  </xsd:complexType> 
</xsd:element> 
<xsd:attributeGroup name="orderItemAttributes"> 
  <xsd:attribute name="id" type="idType" use="required" /> 
  <xsd:attribute name="quantity" type="xsd:integer" default="1" /> 
</xsd:attributeGroup> 
        这个属性组就不详细解释了,不过,大家一看就清楚了吧。最后,我们写一个完整的订书order.xml的Schema文档。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25<?xml version="1.0"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
  <xsd:element name="order"> 
    <xsd:complexType> 
      <xsd:sequence> 
        <xsd:element ref="orderItem" maxOccurs="10" /> 
      </xsd:sequence> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:element name="orderItem"> 
    <xsd:complexType> 
      <xsd:sequence></xsd:sequence> 
      <xsd:attributeGroup ref="orderItemAttributes" /> 
    </xsd:complexType> 
  </xsd:element> 
  <xsd:attributeGroup name="orderItemAttributes"> 
    <xsd:attribute name="id" type="idType" use="required" /> 
    <xsd:attribute name="quantity" type="xsd:integer" default="1" /> 
  </xsd:attributeGroup> 
  <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:schema> 

本文转载并整理自:http://bbs.xml.org.cn/dispbbs.asp?boardID=23&ID=7076
原创粉丝点击