`

xsd概述

 
阅读更多
    DTD和Schema都是对XML文档的一种约束,为什么不就选其中之一,而又有 Schema呢。因为DTD安全度太低了,也就是说它的约束定义能力不足,无法对XML实例文档做出更细致的语义限制。其实细心的人会发现,在DTD中, 只有一个数据类型,就是PCDATA(用在元素中)和CDATA(用在属性中),在里面写日期也行,数字还行,字符更是没问题。而Schema正是针对这 些DTD的缺点而设计的,Schema是完全使用XML作为描述手段,具有很强的描述能力,扩展能力和处理维护能力等。还有DTD不遵守xml语法(写xml文档实例时候用一种语法,写DTD的时候用另外一种语法),下面让我们看一个简单的例子吧


hello.xml
-------------------
<?xml version="1.0"?>
<greeting>Hello World!!</greeting>

说明:

一个根元素:greeting;且这个元素不含属性,无子元素,内容是字符串。

hello.xsd
----------
<?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。xsd:string就是定义的数据类型了,其中的数据类型有很多,比 如:
int,double,dateTime,Boolean,long,integer,float,等,总之Java等语言里有的数据类型它都有,但要以“xsd:”开头。

让我们再看一个里面有子无素的例子:

customer.xml
-----------
<customer>

<name>teiki</name>

<address>No.237, Road Waitan, Shanghai</address>

</customer>

则可以写出以下的XML Schema文档:
customer.xsd

----------------
1: <?xml version="1.0"?>

2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

3: <xsd:element name="customer">

4: <xsd:complexType>

5: <xsd:sequence>

6: <xsd:element name="name" type="xsd:string"/>

7: <xsd:element name="address" type="xsd:string" />

8: </xsd:sequence>

9: </xsd:complexType>

10: </xsd:element>

11: </xsd:schema>

说明:
实例文档customer.xml中,<customer>元素含有两个子元 素,在Schema中凡是有两个以上的子元素,就认为是复杂类型的,所以我们在Schema文档中采用ComplexType来定义该元素。表示有多个 XML子元素。 sequence表示子元素依次出现的顺序。 如果有多层子元素怎么办呢,同样的道理,有几层写几层,一直往下嵌就OK了,这里我要说的是 另一种方法,结构看上去会清晰一些。

address.xml

---------------
<customer>

<name>Teiki</name>

<address>

<!-- address追加一个地址子元素 -->

<prefecture>Zhejiang</prefecture>

<city>Hangzhou</city>

<street>Xilu Road, No.121, 7F</street>

</address>

</customer>

下面就是采用ref元素来编写的这个Schema文档:

address2.xsd

----------------------

1: <?xm l version="1.0"?>

2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

3:

4: <xsd:element name="customer">

5: <xsd:complexType>

6: <xsd:sequence>

7: <xsd:element name="name" type="xsd:string"/>

8: <xsd:element ref="address"/>

9: </xsd:sequence>

10: </xsd:complexType>

11: </xsd:element>

12:

13: <xsd:element name="address">

14: <xsd:complexType>

15: <xsd:sequence>

16: <xsd:element name="prefecture" type="xsd:string"/>

17: <xsd:element name="city" type="xsd:string" />

18: <xsd:element name="street" type="xsd:string" />

19: </xsd:sequence>

20: </xsd:complexType>

21: </xsd:element>

22:

23: </xsd:schema>

说明:
如果按正常的写法,应该把13-21行的内容替换到每8行去,但这里使用ref元素可以直接 将其指向另一个模块,使文档更加具有可读性。 如果元素中包含属性怎么办呢?一样简单,只要在定义完子元素的后面再着定义属性就行了。定义 属性用“attribute”,还是举个例子吧

customer2.xml

---------------

<customer id="001718">

<name>Teiki</name>

<address>No.237, Road Waitan, Shanghai</address>

</customer>

这个例子和上面的一个例子差不多,只是在元素customer中设了一个属性id。

customer2.xsd

------------------

1: <?xml version="1.0"?>

2: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

3:

4: <xsd:element name="customer">

5: <xsd:complexType>

6: <xsd:sequence>

7: <xsd:element name="name" type="xsd:string"/>

8: <xsd:element name="address" type="xsd:string" />

9: </xsd:sequence>

10: <!-- 增加属性定义 -->

11: <xsd:attribute name="id" type="xsd:string"/>

12: </xsd:complexType>

13: </xsd:element>

14:

15: </xsd:schema>

说明:

需要注意的一点是,属性和元素不是一家的,所以要把它放在sequence外面写,但它们都 在customer的孩子,所以要写在complexType的里面。

下面再看一个例子:

order4-1.xsd

----------------------

1:<?xml version="1.0"?>

2:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

3:

4: <xsd:element name="order">

5: <xsd:complexType>

6: <xsd:sequence>

7: <xsd:element ref="orderItem" maxOccurs="10"/>

8: </xsd:sequence>

9: </xsd:complexType>

10: </xsd:element>

11:

12: <xsd:element name="orderItem">

13: <xsd:complexType>

14: <xsd:sequence>

15: <xsd:choice>

16: <xsd:element name="id" type="idType"/>

17: <xsd:element name="name" type="xsd:string"/>

18: </xsd:choice>

19: <xsd:element name="quantity" type="quantityType"/>

20: </xsd:sequence>

21: </xsd:complexType>

22: </xsd:element>

23:

24: <xsd:simpleType name="idType">

25: <xsd:restriction base="xsd:string">

26: <xsd:enumeration value="7-5058-3496-7"/>

27: <xsd:enumeration value="7-5005-6450-3"/>

28: <xsd:enumeration value="7-3020-6069-7"/>

29: </xsd:restriction>

30: </xsd:simpleType>

31:

32: <xsd:simpleType name="quantityType">

33: <xsd:restriction base="xsd:integer">

34: <xsd:minInclusive value="1"/>

35: <xsd:maxInclusive value="10"/>

36: </xsd:restriction>

37: </xsd:simpleType>

38:

39:</xsd:schema>

上面的例子中,maxOccurs代表:相同元素最多出现的次数,与些相反的是 minOccurs代表:出现的最少次数。默认情况下两个都为“1”,如果把minOccurs设为“0”,表示该元素可有可无。choice代表:可选 的元素,也就是在这里面写的元素只能选其中之一,不能全写。simpleType代表自定义数据类型,也就是name里并不是真正的数据类型,而是根据 自己的意愿定制的。restriction代表对某一数据类型做约束,也就是只能取其中范围之内符合要求的,比如第25-29行中,里面又有个元素 enumeration代表枚举,也就是只能在枚举的那几个中选一个,而下在的36-36行,里面又有一对元素minInclusive和 maxInclusive代表类型的
取值范围,也就是只能取大于等于minInclusive并且小于等于maxInclusive的数。

把这个Schema用在XML中是这样的:

<?xml version="1.0" encoding="UTF-8"?>

<order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="D:\ProgramCode\Year2\XML\practice\temp.xsd">

<orderItem>

<id>7-5005-6450-3</id>

<quantity>3</quantity>

</orderItem>

<orderItem>

<name>xyb</name>

<quantity>3</quantity>

</orderItem>

<!-- 注意下面这个是错的,因为超出了规定的范围 -->

<orderItem>

<id>7-5005-6450-3</id>

<quantity>13</quantity>

</orderItem>

<!? 从上面的注释到此,是错误的 -->

</order>

说明:

红色的部分是导入Schema的命令,绿色的是Schema文件的路径,如果用XMLSPY 写时,会自动加上。

对属性的设置,基本上和元素的差不多。比如:

<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:simpleType name="idType">

<xsd:restriction base="xsd:string">

<xsd:pattern value="\d{1}-\d{4}-\d{4}-\d{1}"/>

</xsd:restriction>

</xsd:simpleType>

</xsd:element>

这里我们讲id属性类型作为一种自定义数据类型idType。它的格式就是上面用到的也就是 类似于“7-5005-6450-3”样的。 而且,用attribute元素的use属性来定义是否是必须的属性。
required是必须值,optional是可选值,prohibited是无属性值。 default属性是默认值。




1如何定义一个简单元素
<xs:element  此处表示要定义一个元素
name=”color” 表示要定义元素的名称
type=”xs:string”  表示要定义元素的数据类型
default=”red” 表示定义元素的默认值
fixed=”red”/> 表示要定义元素的固定值,此元素只可以取“red”值
以上定义了一个简单元素,元素实例:<color>red</color>
如何定义一个属性
<xs:attribute
         name=”birthday” 表示要定义属性的名字
         type=”xs:date” 表示要定义属性的数据类型
         default=”2001-01-11” 表示要定义属性的默认值
         fixed=”2001-01-11” 表示要定义属性的固定值
         use=”required”/> 表示此属性是否是必须指定的,即如果不指定就不符合Schema,默认没有use=”required”属性表示属性可有可无
如何定义元素或者属性值的限制
1.最大值最小值限制
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/> 大于等于0,<xs: minExclusive>表示最小值但是不包括指定值
<xs:maxInclusive value="120"/> 小于等于120,<xs: maxExclusive>
</xs:restriction>
</xs:simpleType>
</xs:element>
2.枚举限制,指只能在指定的几个值中取值
         <xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

4.字符串长度的限制
<xs:element name="password">
<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:length value="8"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>
长度必须是8。
<xs:element name="password">
<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:minLength value="5"/>
    <xs:maxLength value="8"/>
  </xs:restriction>
</xs:simpleType>
</xs:element>
表示长度在5-8之间
分享到:
评论

相关推荐

    rspec-xsd:用于确保 XML 针对给定 XSD 进行验证的 Rspec 匹配器

    RSpec::XSD概述RSpec 匹配器,用于确保针对给定 XSD 验证 XML安装将此行添加到应用程序的 Gemfile 中: group :test do gem 'rspec-xsd'end 然后执行: $ bundle或者自己安装: $ gem install rspec-xsd用法在你的 ...

    XSD教程-第5部分(共5部分)-其他有用的地方

    本文提供了有关基础XML模式的构建块的基本概述。

    Liquid.Studio2018 XMLtoXSD

    支持所有xml,xdtd,xsd等相关功能操作修改,转换xmltoxsd,xsdtoxml等等1、新 JSON编辑器版 一个新的入门级版本,专门针对需要图形...除了上面概述的新功能外,现有功能还通过我们的用户请求的功能得到了增强和改进。

    网络工程(高教第二版)

    主要讲述计算机网络的发展、计算机网络的定义和功能、计算机网络的分类、网络通信协议的概念。

    XSD教程-第3部分,共5部分-扩展现有类型

    本文提供了有关基础XML模式的构建块的基本概述。

    XSD教程-第1部分,共5部分-元素和属性

    本文提供了有关基础XML模式的构建块的基本概述。

    ado.net 中文手册(html)

    内容如下: ado.net 概述 ado.net 的设计目标 ado.net 结构 .net 数据提供程序 ado.net dataset 为 .net 数据提供程序编写通用代码 ado.net 示例应用程序 使用.net数据提供程序访问...

    JAX-WS自学笔记

    1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3发布Web Service 2.3.1在...

    WebService之JAX-WS自学笔记

    1、JAX-WS概述 2、创建Web Service 2.1 从java开始 2.1.1 运行wsgen 2.1.2 生成的WSDL和XSD 2.1.3 目录结构 2.2 从WSDL开始 2.2.1 运行wsimport 2.2.2 生成的java代码 2.3发布Web Service ...

    RapidWebDev框架源码

    1. 概述 Eunge 在CodePlex上发表的视屏介绍 RapidWebDev是一个完全开源的企业应用快速开发框架,它提供了在.NET开发中经常会用到的组件和服务,当前包括了常用组件, 扩展模型, 业务平台和 快速web架构四个部分,...

    概述.net开发过程中Bin目录下面几种文件格式

    .pdb、.xsd、.vshost.exe、.exe、.exe.config、.vshost.exe.config 项目发布的时候,往往搞不清楚哪些是需要的,那些是不需要的。那么这些格式的文件到底是干什么用的呢? pdb .pdb文件,是VS生成的用于调试的符号...

    基于Java的Clink Flink流批一体开发框架源码

    项目概述: 本项目是基于Java语言开发的Clink Flink流批一体开发框架,旨在为数据处理提供快速集成的开发解决方案。框架包含203个文件,其中主要构成如下: - Java源文件:169个,构成了框架的核心功能; - 配置...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    XML模式——背景知识、语言和一般用法 &lt;br&gt;10.1 XML模式(XSD)的任务 10.2 格式良好且有效的XML模式 10.3 什么是模式 10.4 XML模式定义语言 10.4.1 XSD中的元素 10.4.2 定义属性 10.5 XML模式...

    基于SpringBoot+Vue前后端分离的仓库管理系统后端源码+数据库+项目说明.zip

    项目概述 项目是基于SpringBoot+Vue前后端分离的仓库管理系统 后端:SpringBoot + MybatisPlus 前端:Node.js + Vue + element-ui 数据库:mysql # 2. 创建后端项目 ## 2.1 创建模块 1. 创建项目模块 2. ...

    ado[1].net中文手册 学习 ado.net的重要资料

    ADO.NET 概述 ADO.NET 的设计目标:讨论创建 ADO.NET 的动机和设计目标。 ADO.NET 结构:提供 ADO.NET 结构和组件的概述。 .NET 数据提供程序:提供有关随 ADO.NET 提供的 .NET 数据提供程序和 .NET 数据提供程序的...

    ServiceStack:为所有人精心设计,过分快速,彻底令人愉悦的Web服务

    查看以了解最新功能,或查看以获取概述。 简单,快速,多功能和功能齐全的服务框架 ServiceStack是一个简单,快速,通用和高效的全功能和框架,其结构经过精心,可来并促进,从而实现最大程度的重用。利用集成的来...

    XMLValidator

    概述 我有一个示例Cocoa项目,该项目调用validateAndReturnError,但是由于XML文档未得到对其架构的引用,因此它无法与架构(XSD)文件一起使用。 我需要代码来设置该引用,以便可以使用其架构来验证XML。 值得...

    jibx-bindings:具有预编译的JiBX绑定的Java类,用于各种公共XML格式

    概述 jibx-bindings项目旨在为各种常见的公共XML文档格式提供Java类库及其相应的预编译JiBX绑定。 通过将JiBX以及来自jibx-bindings的适当的预编译的绑定JAR一起包括在内,您的应用程序都可以在XML和Java之间进行...

Global site tag (gtag.js) - Google Analytics