Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 网站建设 > ASP > XML Schema指南(三)之实例介绍
【标  题】:XML Schema指南(三)之实例介绍
【关键字】:XML,Schema
【来  源】:http://blog.csdn.net/zhangjunhd/archive/2006/12/16/1445549.aspx

XML Schema指南(三)之实例介绍

Your Ad Here XML定义语言做一概述然后重点介绍XML Schema的相关语法翻译XML Schema Tutorialhttp://www.w3schools.com/schema/default.asp),参考http://www.w3pop.com.sixxs.org/tech/。本文为XSD实例部分。
author: zhangjunhd@gmail.com 06-12-16
Blog: http://blog.csdn.net/zhangjunhd/ 

17XSD 实例
这章将示范如何写一份XML Schema.你也会了解到可以使用不同的方法书写schema

17.1一份XML文档
让我们看这份名为
"shiporder.xml"XML文档:
<?xml version="1.0" encoding="ISO-8859-1"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org.sixxs.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 
<orderperson>John Smith</orderperson>
 <shipto>
  <name>Ola Nordmann</name>
  <address>Langgt 23</address>
  <city>4000 Stavanger</city>
  <country>Norway</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"元素。

上面的一行xmlns:xsi="http://www.w3.org.sixxs.org/2001/XMLSchema-instance",告诉了 XML解析器这个文档应该被一份schema检验。xsi:noNamespaceSchemaLocation="shiporder.xsd"指定了 schema应该所在位置(这里它以"shiporder.xml"文件待在相同的文件夹里)。

17.2创建一篇XML Schema
现在我们想要为上面的XML文档创建一份schema

开始先打开叫做"shiporder.xsd"的新文件。为创建新的schema,我们可以简单地按照XML文档的结构,每当发现一个元素时就进行定义。一开始先作标准的XML声明,接下来是定义了schemaxs:schema元素:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org.sixxs.org/2001/XMLSchema">
...
...
</xs:schema>

在上述schema里我们用了标准的名称空间(xs),并且和这个名称空间相联系的URISchema语言定义它有个标准值http://www.w3.org.sixxs.org/2001/XMLSchema.

接下来,我们必须定义"shiporder”元素。这个元素有个属性,并包含着其他的元素,因此我们把它看成是复合类型。"shiporder"元素的子元素由xs:sequence元素包围着,xs:sequence元素定义了子元素一定顺序的排列。
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

那么我们必须将"orderperson"元件定义为简单类型(因为它不含有任何属性或其它元素)。种类用名称空间(namespace)的前缀使用与XML Schema相关的名称空间前缀化,这里的XML Schema指明了一个前缀的Schema数据类型。
<xs:element name="orderperson" type="xs:string"/>

接下来,我们必须定义两个复合类型的元素,"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

现在我们可以来定义"item"元素,这个元素可以在"shiporder"元素里重复出现。这可以通过设置"item"元素的maxOccurs属性为 "unbounded"实现,属性为"unbounded"意味着"item"元素可以根据编者意愿重复出现多次。要注意"note"元素是任意的,我们可以通过设置minOccurs属性为0来实现。
<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>

我们现在可以声明"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.sixxs.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>

17.3划分Schema
上面的设计方法非常简单,但因为文件是复合(或复杂的,Complex)的,所以难于阅读和利用。

下面的设计方法是:先定义所有的元素和属性,然后用ref属性引用它们。

下面是schema文件的新设计方式("shiporder.xsd"):
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org.sixxs.org/2001/XMLSchema">
<!-- definition of simple elements -->
<xs:element name="orderperson" type="xs:string"/>
<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:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
<!-- definition of attributes -->
<xs:attribute name="orderid" type="xs:string"/>
<!-- definition of complex elements -->
<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
   <xs:element ref="address"/>
   <xs:element ref="city"/>
   <xs:element ref="country"/>
  </xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="title"/>
   <xs:element ref="note" minOccurs="0"/>
   <xs:element ref="quantity"/>
   <xs:element ref="price"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="orderperson"/>
   <xs:element ref="shipto"/>
   <xs:element ref="item" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute ref="orderid" use="required"/>
 </xs:complexType>
</xs:element>
</xs:schema>

17.3使用有名称的类型
第三种设计方法定义了种类或类型,这使我们能重新用元素定义。通过给简单类型和复合类型元素命名,接着在元素的种类属性类型里指明它们的方法来做到这点。

这是schema文件("shiporder.xsd")的第三份构思:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org.sixxs.org/2001/XMLSchema">
<xs:simpleType name="stringtype">
 <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="inttype">
 <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>
<xs:simpleType name="dectype">
 <xs:restriction base="xs:decimal"/>
</xs:simpleType>
<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>
<xs:complexType name="shiptotype">
 <xs:sequence>
  <xs:element name="name" type="stringtype"/>
  <xs:element name="address" type="stringtype"/>
  <xs:element name="city" type="stringtype"/>
  <xs:element name="country" type="stringtype"/>
 </xs:sequence>
</xs:complexType>
<xs:complexType name="itemtype">
 <xs:sequence>
  <xs:element name="title" type="stringtype"/>
  <xs:element name="note" type="stringtype" minOccurs="0"/>
  <xs:element name="quantity" type="inttype"/>
  <xs:element name="price" type="dectype"/>
 </xs:sequence>
</xs:complexType>
<xs:complexType name="shipordertype">
 <xs:sequence>
  <xs:element name="orderperson" type="stringtype"/>
  <xs:element name="shipto" type="shiptotype"/>
  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
 </xs:sequence>
 <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>
<xs:element name="shiporder" type="shipordertype"/>
</xs:schema>

约束元素指出了这个数据类型是由一个W3C XML Schema名称空间数据类型派生出来的。所以,下面的片段意味着元素或属性的值必须是一个字符串的值:
<xs:restriction base="xs:string">
约束元素常常用于给元素添加约束。请看上述schema中的几行:
<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

这指出了元素或属性的值必须是字符串,而且必须是一排6个从09之间的数字。

XML Schema指南(四)之Data Types:【上一篇】
XML Schema指南(二)之Complex Types:【下一篇】
【相关文章】
  • XML Schema指南(四)之Data Types
  • NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(一)
  • NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(二)
  • NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
  • - lastChild 返回当前XML结点的最后一个子结点 -
  • 实际项目:基于xml的数据交换平台!欢迎参加讨论!
  • XMLHttpRequest对象的属性和方法
  • [收藏] XML Notepad 2007
  • 使用dom4j解析xml文件时遇到一个怪问题
  • Dom4j递归解析XML实现JS的getElementsByName类似方法
  • 【随机文章】
  • 计值到无穷
  • 备份必知:五个原因导致备份故障
  • 给你大量资源,VS.NET 学习方法论
  • Re: IPS technology question.
  • perl-xml
  • Myeclipse平台struts+hibernate+spring项目开发示例
  • ASP.NET 2.0 王者归来
  • Windows XP SP2"安全中心"面面观
  • 在Linux下设置Apache虚拟主机
  • Gang of Four,到底翻译成是“四人帮“还是”四人组“
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.