XML Schema

1.XML Schema 的基本概念

2.XML Schema 的数据类型

3.XML Schema 的根元素的声明

4.XML Schema 的元素及属性声明

5.XML Schema 对值的限制

6.综合练习

7.schema验证方式



1.XML Schema 的基本概念

XML Schema 语言有两种类型:MIcosoft开发的Microsoft XML Schema 和 W3C 开发的W3C XML Schema 。

最为正式的XML Schema 语言是由W3C制定的XML Schema规范简称为XSD (XML Schema Definition)

DTD 与XML schema 的适用情况:

DTD适合以下情形:

1.文件是叙述性的,并有混合内容。

2.需要有约束标记之间的关系,特别是子标记的顺序关系,而不是标记本身的文本内容

3.需要使用实体

4.XML文件的使用者对使用的DTD达成一致。

XML Schema 则非常适合下列情形:

1,需要定义数据类型,以便约束标记的文本内容的内部结构

2.不强调子标记的顺序,而是强调其数量

3.标记约束不限于父子关系,还需要考虑祖先及子孙的关系

4.跨越多个文件,命名空间前缀不一致

(XML Schema 是 W3C 标准)

(注明:以上摘自《XML基础教程与实验指导》)


2.XML Schema 的数据类型

分为简单类型和复杂类型:

1)简单类型:

string

decimal   十进制数型,包含任意精度和位数

integer

float

boolean

date 定义一个日期值
dateTime 定义一个日期和时间值
duration 定义一个时间间隔
gDay 定义日期的一个部分 - 天 (DD)
gMonth 定义日期的一个部分 - 月 (MM)
gMonthDay 定义日期的一个部分 - 月和天 (MM-DD)
gYear 定义日期的一个部分 - 年 (YYYY)
gYearMonth 定义日期的一个部分 - 年和月 (YYYY-MM)
time 定义一个时间值




uri-reference 元素包含了一个URL

2)复杂类型


复杂类型的元素有子元素和属性,也可以有字符内容。共有4种:

  • 空元素
  • 包含其他元素的元素
  • 仅包含文本的元素
  • 包含元素和文本的元素


3.XML Schema根元素的声明(内容来自w3c)

<?xml version="1.0"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

...
...
</xs:schema>

代码解释:

下面的片断:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs:

这个片断:

targetNamespace="http://www.w3school.com.cn" 

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。

这个片断:

xmlns="http://www.w3school.com.cn" 

指出默认的命名空间是 "http://www.w3school.com.cn"。

这个片断:

elementFormDefault="qualified" 

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。


4.XML元素及属性声明

1)定义简单元素格式:

<xs:element name="xxx" type="yyy"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/> 

简易元素的默认值和固定值

简易元素可拥有指定的默认值或固定值。

当没有其他的值被规定时,默认值就会自动分配给元素。

在下面的例子中,缺省值是 "red":

<xs:element name="color" type="xs:string" default="red"/>

固定值同样会自动分配给元素,并且您无法规定另外一个值。

在下面的例子中,固定值是 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

下面的例子定义了带有一个限定且名为 "age" 的元素。age 的值不能低于 0 或者高于 120:

<xs:element name="age">

<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>

</xs:element> 

更多例子:http://www.w3school.com.cn/schema/schema_facets.asp

定义属性的语法是:

<xsd:attribute name="属性名" type="基本数据类型" use="条件" />

use的取值可以有:required 、optional、fixed和default

2)复合元素类型(内容参考自:http://www.runoob.com/schema/schema-complex-mixed.html

1.空元素

<product prodid="1345" />


方法一:

<xs:element name="product">
  <xs:complexType>
    <xs:attribute name="prodid" type="xs:positiveInteger"/>
  </xs:complexType>
</xs:element>

方法二:

<xs:element name="product" type="prodtype"/>

<xs:complexType name="prodtype">
  <xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>



2.仅含元素:

<person>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</person>

解:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>


3.仅含文本

<shoesize country="france">35</shoesize>


解:

<xs:element name="shoesize">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:integer">
        <xs:attribute name="country" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>


其中

<xs:extension base="xs:integer">
        ....
        ....
</xs:extension>

可以换成:

<xs:restriction base="xs:integer">
        ....
        ....
</xs:restriction>


4.混合内容

<letter>
  Dear Mr.<name>John Smith</name>.
  Your order <orderid>1032</orderid>
  will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>


<xs:element name="letter">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="orderid" type="xs:positiveInteger"/>
      <xs:element name="shipdate" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

group、all、choice、sequence
(1)group 元素用于定义在复杂类型定义中使用的元素组。
语法格式:


<group    name=名称    ref=组名    maxOccurs=数值   minOccurs=数值>
<all|choice|sequence>
</group>

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:group name="custGroup">
 <xs:sequence>
  <xs:element name="customer" type="xs:string"/>
  <xs:element name="orderdetails" type="xs:string"/>
  <xs:element name="billto" type="xs:string"/>
  <xs:element name="shipto" type="xs:string"/>
 </xs:sequence>
</xs:group>

<xs:element name="order" type="ordertype"/>
<xs:complexType name="ordertype">
  <xs:group ref="custGroup"/>
  <xs:attribute name="status" type="xs:string"/>
</xs:complexType>
</xs:schema>


2)all 元素规定子元素能够以任意顺序出现,每个子元素只出现0或1次。


<xs:element name="person">
  <xs:complexType>
    <xs:all minOccurs="0">
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

(3)choice 仅允许包含在 <choice> 声明中的元素之一出现在包含元素中 。


<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>


(4)sequence 要求组中的元素以指定的顺序出现在包含元素中。每个子元素只能出现1次。


<xs:element name="personinfo">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" 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>

5.对值的限制

<xs:element name="letter">
<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-z]"/>  --value值为一段匹配文字的正则表达式
  </xs:restriction>
</xs:simpleType>
</xs:element>

6.综合练习

题目如下:

  1. 为一个汽车的列表创建一个DTD,每一个car有子元素make、model、year、color、engine、number_of_doors、transmission_type和accessories。 元素engine有子元素number_of_cylinders和fuel_system(其值有两种carbureted和fuel-injected)。 元素accessories有属性radio、air_conditioning、power_windows、power_steering和power_brakes,以上属性均是必须的,且值为yes和no。 将现在流行汽车的名字声明为实体。 注意:上述有的条件限制用 DTD 无法实现,DTD跳过即可,需用第三题的 Schema 技术。
  2. 创建一个至少包含3个题目1中car元素实例的XML文档。用练习1中的 DTD 来处理该文档,验证有效性。
  3. 为练习1和练习2中描述的XML文档创建一个XML Schema,Schema 的使用自学课本第7章和网络教程(见下方参考教程地址)。



<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qulified" >

<!-- 逻辑结构 -->
<xs:element name="cars" >
	<xs:complexType>
		<xs:sequence>
			<xs:element ref="car" />
		</xs:sequence> 
	</xs:complexType>
</xs:element>

<!--元素的定义 -->
<xs:element name="car" >
        <xs:complexType>
                <xs:sequence>
                        <xs:element ref="make"/>
                        <xs:element ref="model" />
                        <xs:element ref="year" />
                        <xs:element ref="color"/>
                        <xs:element ref="engine"  />
                        <xs:element ref="number_of_doors"/>
                        <xs:element ref="transmission_type"  />
                        <xs:element ref="accessories" />
                </xs:sequence>

        </xs:complexType>
</xs:element>
<xs:element name="make" type="xs:string"/>
<xs:element name="model" type="xs:string" />
<xs:element name="year" type="xs:date" />
<xs:element name="color" type="xs:string" />
<xs:element name="engine"  >
	<xs:complexType>
		<xs:simpleContent>
      			<xs:extension base="xs:string">
       		<xs:attribute ref="number_of_cylinders"  use="required"/>
                <xs:attribute ref="fuel_system"  use="required"/>
			</xs:extension>
   		 </xs:simpleContent>
	</xs:complexType>
</xs:element>
<xs:element name="number_of_doors" type="integer" />
<xs:element name="transmission_type" type="xs:string" />
<xs:element name="accessories" >
 <xs:complexType>
	<xs:simpleContent>
		<xs:extension base="xs:string">
<xs:attribute ref="radio" use="required" />
<xs:attribute ref="air_conditioning" use="required" />
<xs:attribute ref="power_windows" use="required"/>
<xs:attribute ref="power_steering" use="required" />
<xs:attribute ref="power_brakes" use="required" />
		</xs:extension>
	</xs:simpleContent>
  </xs:complexType>
</xs:element>




<!--属性的定义 -->
<xs:attribute name="number_of_cylinders"  type="xs:integer" />
<xs:attribute name="fuel_system"  >
	<xs:simpleType>
		<xs:restriction base="xs:string" >
			<xs:enumeration value="carbureted" />
			<xs:enumeration value="fuel-injected" />
		</xs:restriction>
	</xs:simpleType>	
</xs:attribute>

<xs:attribute name="radio"  type="yesOrNoType" />
<xs:attribute name="air_conditioning"  type="yesOrNoType" />
<xs:attribute name="power_windows"  type="yesOrNoType" />
<xs:attribute name="power_steering"  type="yesOrNoType" />
<xs:attribute name="power_brakes"   type="yesOrNoType"/>

<xs:simpleType name="yesOrNoType"  >
	
	<xs:restriction base="xs:string" >
              	<xs:enumeration value="yes" />
               	<xs:enumeration value="no" />
        </xs:restriction>
</xs:simpleType>



</xs:schema>



依据该schema,在myeclipse里自动生成的模板如下:

<?xml version="1.0" encoding="UTF-8"?>
<cars xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.w3.org/2001/XMLSchema">
  <car>
    <make>make</make>
    <model>model</model>
    <year>2001-01-01</year>
    <color>color</color>
    <engine fuel_system="carbureted" number_of_cylinders="0">engine</engine>
    <number_of_doors>0</number_of_doors>
    <transmission_type>transmission_type</transmission_type>
    <accessories air_conditioning="yes" power_brakes="yes" power_steering="yes" power_windows="yes" radio="yes">accessories</accessories>
  </car>
</cars>


7.schema验证的方式

暂时只找到在myeclipse 添加xml shcema ,然后根据其定义的规则自动生成xml模板。过查看生成的模板判断schema是否书写正确。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值