微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML Schema约束

schema规范中:
1. namespace : schema文件的标识属性,相当于id,每个schema文件需要有一个唯一的namespace值;
2. targetNameSpace :指定当前schema文件的namespace值,它的值是一个url(很有可能不存在);
3. xmlns :引入一个schema约束,它的值为一个schema的namespace值
属性? : 用xmlns属性
属性值: 对应的schema文件的id(namespace值)
4.schemaLocation:如果引入的schema不是w3c组织定义,必须指定schema文件的位置;
5.element :定义标签(常用类型:string,decimal,integer,boolean,date,time)

6.elementFormDefault:控制元素。有两个取值:"qualified"-在XML文档中使用局部元素时,必须使用限定短名作为前缀;unqualified-在XML文档中使用局部元素时,可以省略限定短名;

7.attributeFormDefault:控制属性的。用法与elementFormDefault一样;

8.如果引入了N个约束,需要给n-1个取别名(如下:xsd为w3c约束的别名);

复杂类型:一个元素如有属性或者包含子元素,那么这个元素就是复杂类型。复杂类型使xsd:complexType定义。复杂类型要么具有简单内容,要么具有复杂内容内容是指在开始标签和结束标签间的字符数据和子元素。简单内容是指内容只具有字符数据没有子元素,简单内容是用xsd:simpleContent元素来定义(简单内容要有属性,否则等同于简单类型)。除此之外的就是复杂内容,使用xsd:complexContent来定义。

xsd:attribute元素的use、default、fixed属性

use属性指示xsd:attribute元素是否需要出现,其有效值为:optional(可选的,use属性认值)、prohibited(禁止使用属性)、required属性是必须的)。对全局声明的属性不能使用use属性

例子:book.xsd

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/bookSchema"
elementFormDefault="qualified">
<xsd:elementname="bookrack">
<xsd:complexType>
<xsd:sequence>
<!--maxOccurs:限定元素个数,一个书架最多基本书-->
<xsd:elementname="book"maxOccurs="3">
<!--complexType:复杂类型-->
<xsd:complexType>
<!--sequence:有顺序-->
<xsd:sequence>
<xsd:elementname="name"type="xsd:string"/>
<xsd:elementname="author">
<xsd:complexType>
<xsd:sequence>
<xsd:elementname="firstname"type="xsd:string"/>
<xsd:elementname="lastname"type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:elementname="price">
<!--simpleType:简单类型-->
<xsd:simpleType>
<!--restriction:限定-->
<xsd:restrictionbase="xsd:integer">
<!--minInclusive:最小值;pattern:正则;length:长度;enumeration:枚举;-->
<xsd:minInclusivevalue="0"/>
<!--maxInclusive:最大值-->
<xsd:maxInclusivevalue="120"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:elementname="desc"type="remark"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!--具有简单内容的复杂类型扩展-->
<!--complexType:复杂类型-->
<xsd:complexTypename="remark">
<!--simpleContent:简单内容-->
<xsd:simpleContent>
<xsd:extensionbase="xsd:string">
<!--use属性:optional:可选;required:必填;prohibited:禁用属性-->
<!--default属性:认值EN;-->
<!--fixed属性:指示固定值,不管该属性出现不出现,该属性的值都是EN-->
<xsd:attributename="lang"use="required"default="EN"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>

book.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!--书架-->
<bookrackxmlns="http://www.ciyo.com/bookSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.ciyo.com/bookSchemabook.xsd">
<!--书-->
<book>
<!--书名-->
<name>JavaScript开发</name>
<!--作者-->
<author>
<firstname>John</firstname>
<lastname>Smith</lastname>
</author>
<!--价格-->
<price>100</price>
<!--描述-->
<desclang="EN">EN</desc>
</book>
</bookrack>

派生复杂类型--扩展

当从简单类型或具有简单内容的复杂类型派生复杂类型时(注意:简单内容直接或间接派生出来的复杂类型也必须是简单内容,简单内容不能派生复杂内容),使用xs:simpleContent元素,如果是扩展派生,使用xs:extension元素,如果是限制派生,使用xs:restriction元素。

1.扩展简单内容

扩展简单内容可以从简单类型或具有简单内容的复杂类型扩展。由于不能通过扩展简单内容来得到复杂内容,因此对简单内容的扩展只能是添加新的属性

employee.xsd (标签employee属性number扩展了属性birthdate)

(1).从具有简单内容的复杂类型扩展

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/employeeSchema"
elementFormDefault="qualified">
<xsd:elementname="employee"type="expandEmpType"/>
<xsd:complexTypename="empType">
<xsd:simpleContent>
<xsd:extensionbase="xsd:token">
<xsd:attributename="number"type="xsd:token"use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:complexTypename="expandEmpType">
<xsd:simpleContent>
<xsd:extensionbase="empType">
<xsd:attributename="birthdate"type="xsd:date"use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>

(2).从简单类型扩展

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/employeeSchema"
elementFormDefault="qualified">
<xsd:elementname="employee"type="expandEmpType"/>
<xsd:complexTypename="expandEmpType">
<xsd:simpleContent>
<xsd:extensionbase="xsd:string">
<xsd:attributename="number"type="xsd:string"use="required"/>
<xsd:attributename="birthdate"type="xsd:date"use="required"/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
</xsd:schema>

employee.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<employeexmlns="http://www.ciyo.com/employeeSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.ciyo.com/employeeSchemaemployee.xsd"

number="100"birthdate="2017-12-25"/>

2.扩展纯元素内容

从纯元素内容的复杂类型扩展,我们可以在基类型的内容模型最后添加新的与元素或属性。模式处理器会把基类型的内容模型和新增的内容模型合并到一个sequence中。注意不能对一个all组的基类型进行扩展添加新的元素(添加属性是可以的)。

fruit.xsd

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/fruitSchema"
elementFormDefault="qualified">
<xsd:elementname="fruit"type="expandedFruitType"/>
<xsd:complexTypename="fruitType">
<xsd:complexContent>
<xsd:restrictionbase="xsd:anyType">
<xsd:sequence>
<xsd:elementname="Apple"type="xsd:string"/>
<xsd:elementname="Pear"type="xsd:string"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexTypename="expandedFruitType">
<xsd:complexContent>
<xsd:extensionbase="fruitType">
<xsd:sequence>
<xsd:elementname="Banane"type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>

fruit.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<fruitxmlns="http://www.ciyo.com/fruitSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.ciyo.com/fruitSchemafruit.xsd">
<Apple>apple</Apple>
<Banane>banane</Banane>
<Pear>pear</Pear>
</fruit>

3.扩展混合内容

混合内容的扩展跟纯元素的扩展类似,唯一的要求是派生类型也必须具有混合内容,也就是mixed=true。

employee.xsd

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/employeeSchema"
elementFormDefault="qualified">
<xsd:elementname="employee"type="expandedEmpType"/>
<xsd:complexTypename="empType"mixed="true">
<xsd:sequence>
<xsd:elementname="name"type="xsd:string"/>
<xsd:elementname="age"type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexTypename="expandedEmpType"mixed="true">
<xsd:complexContent>
<xsd:extensionbase="empType">
<xsd:sequence>
<xsd:elementname="salary"type="xsd:integer"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>

employee.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<employeexmlns="http://www.ciyo.com/employeeSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.ciyo.com/employeeSchemaemployee.xsd">
<name>Jon</name>
<age>28</age>
<salary>15</salary>
</employee>

4.扩展空内容

从空内容类型扩展,派生类型可以具有纯元素内容,也可以就混合内容

employee.xsd

<?xmlversion="1.0"encoding="UTF-8"?>
<xsd:schemaxmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ciyo.com/employeeSchema"
elementFormDefault="qualified">
<xsd:elementname="employee"type="extendedEmpType"/>
<xsd:complexTypename="empType">
<xsd:attributename="number"type="xsd:string"use="required"/>
</xsd:complexType>
<xsd:complexTypename="extendedEmpType"mixed="true">
<xsd:complexContent>
<xsd:extensionbase="empType">
<xsd:sequence>
<xsd:elementname="name"type="xsd:string"/>
<xsd:elementname="age"type="xsd:integer"/>
</xsd:sequence>
<xsd:attributename="remark"use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>

employee.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<employeexmlns="http://www.ciyo.com/employeeSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
xsd:schemaLocation="http://www.ciyo.com/employeeSchemaemployee.xsd"

number="1"remark="普通员工">
<name>Tom</name>
<age>27</age>
</employee>

restriction数据类型的限定:


参考:http://blog.csdn.net/tuolingss/article/details/8541687

原文地址:https://www.jb51.cc/xml/294190.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。