一个 XSD 实例
一个 XSD 实例
本节会为您演示如何编写一个 XML Schema。您还将学习到编写 schema 的不同方法。
XML 文档
让我们看看这个名为 "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" 元素。
上面这一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根据某个 schema 来验证此文档。
这一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 规定了 schema 的位置(在这里,它与 "shiporder.xml" 处于相同的文件夹)。
创建一个 XML Schema
现在,我们需要为上面这个 XML 文档创建一个 schema。
我们可以通过打开一个新的文件来开始,并把这个文件命名为 "shiporder.xsd"。要创建schema,我们仅仅需要简单地遵循 XML 文档中的结构,定义我们所发现的每个元素。首先我们开始定义一个标准的 XML 声明:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
- ...
- ...
- </xs:schema>
在上面的 schema 中,我们使用了标准的命名空间 (xs),与此命名空间相关联的 URI 是 Schema 的语言定义(Schema language definition),其标准值是 http://www.w3.org/2001/XMLSchema。
接下来,我们需要定义 "shiporder" 元素。此元素拥有一个属性,其中包含其他的元素,因此我们将它认定为复合类型。"shiporder" 元素的子元素被 xs:sequence 元素包围,定义了子元素的次序:
- <xs:element name="shiporder">
- <xs:complexType>
- <xs:sequence>
- ...
- ...
- </xs:sequence>
- ...
- </xs:complexType>
- </xs:element>
然后我们需要把 "orderperson" 元素定义为简易类型(这是因为它不包含任何属性或者其他的元素)。类型 (xs:string) 的前缀是由命名空间的前缀规定的,此命名空间与指示预定义的 schema 数据类型的 XML 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" 来实现的,这样 "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/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>
分割 Schema
前面的设计方法非常容易,但当文档很复杂时却难以阅读和维护。
接下来介绍的设计方法基于首先对所有元素和属性的定义,然后再使用 ref 属性来引用它们。
这是用新方法设计的 schema 文件:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <!-- 简易元素的定义 -->
- <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"/>
- <!-- 属性的定义 -->
- <xs:attribute name="orderid" type="xs:string"/>
- <!-- 复合元素的定义 -->
- <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>
使用指定的类型(Named Types)
第三种设计方法定义了类或者类型,这样使我们有能力重复使用元素的定义。具体的方式是:首先对简易元素和复合元素进行命名,然后通过元素的 type 属性来指向它们。
这是利用第三种方法设计的 schema 文件 ("shiporder.xsd"):
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <xs:schema xmlns:xs="http://www.w3.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>
restriction 元素显示出数据类型源自于 W3C XML Schema 命名空间的数据类型。因此,下面的片段也就意味着元素或属性的值必须是字符串类型的值:
- <xs:restriction base="xs:string">
- <xs:simpleType name="orderidtype">
- <xs:restriction base="xs:string">
- <xs:pattern value="[0-9]{6}"/>
- </xs:restriction>
- </xs:simpleType>
这段代码指示出,元素或属性的值必须为字符串,并且必须是连续的六个字符,同时这些字符必须是 0-9 的数字。
来自:http://www.w3school.com.cn/schema/schema_example.asp
一个 XSD 实例的更多相关文章
- XSD实例
XSD实例 在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改), ...
- 初识Quartz之第一个Quartz实例
转: 初识Quartz之第一个Quartz实例 2018年04月09日 17:07:31 carson0408 阅读数:366 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...
- Android 只开启一个Activity实例
在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种. 方法一:设置起动模式 一个Activity有四种启动模式 ...
- 将oracle冷备份恢复到另外一个数据库实例中
因更换服务器需要将Oracle数据库转移到另外台Oracle中.说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不一 ...
- 第一个python实例--监控cpu
#第一个python实例:监控cpu #/bin/bash/env Python from __future__ import print_function from collections impo ...
- servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解1
servlet的一个web容器中有且只有一个servlet实例或有多个实例的理解 (2013-06-19 19:30:40) 转载▼ servlet的非线程安全,action的线程安全 对提交 ...
- 12C RAC中的一个数据库实例自动crash并报ORA-27157、ORA-27300等错误
rhel7.2上安装12C RAC数据库后,其中一个数据库实例经常会自动crash.查看alert日志发现以下错误信息: Errors in file /d12/app/oracle/diag/rdb ...
- Asp.Net MVC是否针对每次请求都重新创建一个控制器实例
一.Asp.Net MVC是否针对每次请求都重新创建一个控制器实例 默认情况下,答案是确定的. ControllerBuilder类 ControllerBuilder.Current用户获取默认的控 ...
- 如何让Windows程序只运行一个程序实例?
要实现VC++或者MFC只运行一个程序实例,一般采用互斥量来实现,即首先用互斥量封装一个只运行一个程序实例的函数接口: HANDLE hMutex = NULL; void MainDlg::RunS ...
随机推荐
- iframe仿Ajax上传文件
利用iframe框架完成文件上传 前端页面 <!doctype html> <html lang="en"> <head> <meta c ...
- MyBatis(3.2.3) - Paginated ResultSets using RowBounds
Sometimes, we may need to work with huge volumes of data, such as with tables with millions of recor ...
- Linux 命令 - kill: 向进程发送信号
kill 命令通常用来 “杀死”(终止)进程,它可以用来终止运行不正常的程序或者反过来拒绝终止的程序.kill 命令准确地说并不是 “杀死” 进程,而是给进程发送信号(signal). 和文件一样,进 ...
- Git CMD - reset: Reset current HEAD to the specified state
命令格式 git reset [-q] [<tree-ish>] [--] <paths>… git reset (--patch | -p) [<tree-ish&g ...
- asp网站发布步骤总结
1.在VS2012中打开索要发布的网站,初始页可重命名为index.html或default.apx. 2.点击 生成>生成“网站”,然后“发布网站”. 3.进行发布设置: (1 配置文件 ( ...
- Java加密解密相关
关于解释加密解密中的填充方案: http://laokaddk.blog.51cto.com/368606/461279/ 关于对称加密中的反馈模式: http://blog.csdn.net/aaa ...
- 【Android】日常开发android.jar文件中十五个重要的包概述
简述Android项目中android.jar文件里包含较为重要的15个系统编译后的class文件 android.app:提供高层的程序模型,提供基本的运行环境android.content:包含各 ...
- VS2010与QT的集成开发环境
http://blog.csdn.net/hbsong75/article/details/9293773 QT与Java有点类似,也是一种跨平台的软件(当然在windows平台和Linux平台需要安 ...
- JAVA TCP网络编程学习笔记
一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...
- 用命令行将Java程序打包为jar文件
如何把写好的Java程序打包为jar文件呢?有两种方式可以选择 1.命令行的方式: 打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:Jav ...