如何编写一个 XML Schema

看看这个名为 "shiporder.xml" 的 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</country>
 </shipto>
 <item>
  <title>Empire Burlesque</title>
  <note>Special Edition</note>
  <quantity>1</quantity>
  <price>10.90</price>
 </item>
 <item>
  <title>Hide your heart</title>
  <quantity>1</quantity>
  <price>9.90</price>
 </item>
</shiporder>

说明:
上面的XML文档包括根元素 "shiporder",其中包含必须名为 "orderid" 的属性。"shiporder" 元素包含三个不同的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出现了两次,它含有一个 "title"、一个可选 "note" 元素、一个 "quantity" 以及一个 "price" 元素。

1.首先我们开始定义一个标准的 XML 声明:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...


</xs:schema>


2.需要定义 "shiporder" 元素。此元素拥有一个属性,其中包含其他的元素,因此我们将它认定为复合类型。"shiporder" 元素的子元素被 xs:sequence 元素包围,定义了子元素的次序:
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

3.我们需要把 "orderperson" 元素定义为简易类型(这是因为它不包含任何属性或者其他的元素)。类型 (xs:string) 的前缀是由命名空间的前缀规定的,此命名空间与指示预定义的 schema 数据类型的 XML schema 相关联:
<xs:element name="orderperson" type="xs:string"/>

4.我需要把两个元素定义为复合类型:"shipto" 和 "item"。我们从定义 "shipto" 元素开始:
<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="name" type="xs:string"/>
   <xs:element name="address" type="xs:string"/>
   <xs:element name="city" type="xs:string"/>
   <xs:element name="country" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

注意:  schema,我们可使用 maxOccurs 和 minOccurs 属性来定义某个元素可能出现的次数。maxOccurs 定义某元素出现次数的最大值,而 minOccurs 则定义某元素出现次数的最小值。maxOccurs 和 minOccurs 的默认值都是 1!
5.我们可以定义 "item" 元素了。这个元素可在 "shiporder" 元素内部出现多次。这是通过把 "item" 元素的 maxOccurs 属性的值设定为 "unbounded" 来实现的,这样 "item" 元素就可出现创作者所希望的任意多次。
<xs:element name="item" maxOccurs="unbounded">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="title" type="xs:string"/>
   <xs:element name="note" type="xs:string" minOccurs="0"/>
   <xs:element name="quantity" type="xs:positiveInteger"/>
   <xs:element name="price" type="xs:decimal"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
6.

我们可以声明 "shiporder" 元素的属性了。由于这是一个必选属性,我们规定 use="required"。

注释:此属性的声明必须被置于最后:

<xs:attribute name="orderid" type="xs:string" use="required"/>

总结:

这是这个名为 "shiporder.xsd" 的 schema 文件的文档清单:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="orderperson" type="xs:string"/>
   <xs:element name="shipto">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="item" maxOccurs="unbounded">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>






























































































[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLSchema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值