XML-约束(schema)

我们已经知道了只有有约束的XML文件才能算是一个有效的文件,说到约束除了dtd约束还可以有其他的方法吗?

接下来就是我要介绍的新的约束——schema约束:

@H_301_9@XMLSchema @H_301_9@也是一种用于定义和描述 @H_301_9@XML@H_301_9@文档结构与内容的模式语言,其出现是为了克服 @H_301_9@DTD@H_301_9@的局限性

@H_301_9@XMLSchema VS DTD@H_301_9@:

@H_301_9@ XMLSchema@H_301_9@符合@H_301_9@XML@H_301_9@语法结构。

@H_301_9@DOM@H_301_9@、@H_301_9@SAX@H_301_9@等@H_301_9@XML API@H_301_9@很容易解析出@H_301_9@XML Schema@H_301_9@文档中的内容

@H_301_9@XMLSchema@H_301_9@对名称空间@H_301_9@支持得非常好。

@H_301_9@XMLSchema@H_301_9@比@H_301_9@XML DTD@H_301_9@支持更多的数据类型,并支持用户自定义新的数据类型。

@H_301_9@XMLSchema@H_301_9@定义约束的能力非常强大,可以对@H_301_9@XML@H_301_9@实例文档作出细致的语义限制。

@H_301_9@XML Schema@H_301_9@不能像@H_301_9@DTD@H_301_9@一样定义实体,比@H_301_9@DTD@H_301_9@更复杂,但@H_301_9@Xml Schema@H_301_9@现在已是@H_301_9@w3c@H_301_9@组织的标准,它正逐步取代@H_301_9@DTD@H_301_9@。

那么什么是schema呢?

@H_301_9@XMLSchema @H_301_9@文件自身就是一个 @H_301_9@XML @H_301_9@文件,但它的扩展名通常为 @H_301_9@. @H_301_9@xsd @H_301_9@。
@H_301_9@一个 @H_301_9@XMLSchema @H_301_9@文档通常称之为 模式文档 @H_301_9@( @H_301_9@约束文档 @H_301_9@) @H_301_9@,遵循这个文档书写的 @H_301_9@xml @H_301_9@文件称之为 实例文档 @H_301_9@。
@H_301_9@和 @H_301_9@XML @H_301_9@文件一样,一个 @H_301_9@XMLSchema @H_301_9@文档也必须有一个根结点,但这个根结点的名称为 @H_301_9@Schema @H_301_9@。
@H_301_9@编写了一个 @H_301_9@XMLSchema @H_301_9@约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在 @H_301_9@XMLSchema @H_301_9@技术中有一个专业术语来描述这个过程,即把 @H_301_9@XMLSchema @H_301_9@文档声明的元素绑定到一个 名称空间 @H_301_9@上,以后 @H_301_9@XML @H_301_9@文件就可以通过这个 @H_301_9@URI @H_301_9@(即名称空间)来告诉解析引擎, @H_301_9@xml @H_301_9@文档中编写的元素来自哪里,被谁约束。
接下来,大家可以通过一个案例来看看schema的使用方法

@H_301_9@接下来让我们来看看schema语法的具体说明:

名称空间的概念:

@H_301_9@ 在 @H_301_9@XMLSchema @H_301_9@中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的 @H_301_9@URI @H_301_9@( @H_301_9@UniformResource Identifier @H_301_9@,统一资源标识符)表示。在 @H_301_9@Xml @H_301_9@文件中书写标签时,可以通过名称空间声明( @H_301_9@xmlns @H_301_9@),来声明当前编写的标签来自哪个 @H_301_9@Schema @H_301_9@约束文档。如:

@H_301_9@ @H_301_9@<@H_301_9@csdn@H_301_9@:@H_301_9@书架@H_301_9@xmlns:csdn@H_301_9@=“http://www.csdn.net”>

@H_301_9@ <@H_301_9@csdn@H_301_9@:@H_301_9@书@H_301_9@>……</@H_301_9@csdn@H_301_9@:@H_301_9@书@H_301_9@>

@H_301_9@ </@H_301_9@csdn@H_301_9@:@H_301_9@书架@H_301_9@>

此处使用csdn来指向声明的名称,以便于后面对名称空间的引用。

@H_301_9@ 注意:名称空间的名字语法容易让人混淆,尽管以 @H_301_9@http:// @H_301_9@开始,那个 @H_301_9@URL @H_301_9@并不指向一个包含模式定义的文件。事实上,这个 @H_301_9@URL @H_301_9@: @H_301_9@http://www.csdn.net @H_301_9@根本没有指向任何文件,只是一个分配的名字。
使用名称空间引入Schema:
@H_301_9@为了在一个 @H_301_9@XML @H_301_9@文档中声明它所遵循的 @H_301_9@Schema @H_301_9@文件的具体位置,通常需要在 @H_301_9@Xml @H_301_9@文档中的根结点中使用 @H_301_9@schemaLocation @H_301_9@属性来指定,例如:

@H_301_9@ @H_301_9@<@H_301_9@csdn@H_301_9@:@H_301_9@书架@H_301_9@xmlns@H_301_9@:@H_301_9@csdn@H_301_9@="http://www.@H_301_9@csdn.net@H_301_9@"

@H_301_9@ @H_301_9@xmlns:xsi@H_301_9@="http://www.w3.org/2001/XMLSchema-instance"

@H_301_9@ @H_301_9@xsi:schemaLocation@H_301_9@=“http://www.@H_301_9@csdn.net@H_301_9@book.xsd">

@H_301_9@schemaLocation@H_301_9@此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的@H_301_9@XML schema @H_301_9@的位置,两者之间用空格分隔。

@H_301_9@ 注意,在使用 @H_301_9@schemaLocation @H_301_9@属性时,也需要指定该属性来自哪里。
使用默认名称空间:

那么究竟schema的语法又是什么呢?

xsd约束文件

<?xml version="1.0" encoding="UTF-8"?> <game:schema xmlns:game="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/asd" xmlns="http://www.example.org/asd" elementFormDefault="qualified"> <!-- 需要引用w3c的命名空间,并指定一个命名空间,将所有的约束绑定到指定的命名空间当中 --> <!-- schema语法练习: 1.XSD简易属性 2.XSD属性 3.限定值 4.通过枚举限定值 5.根据正则表达式来限定值 6.定义以及使用复合类型 7.XSD仅含文本复合元素 --> <!-- 6.定义复合类型 --> <game:complexType name="game_Name"><!-- 6.使用复合类型 --> <game:all> <game:element name="刀塔" type="game:string"/> <game:element name="英雄联盟" type="game:string"/> <game:element name="反恐精英" type="game:string"/> </game:all> </game:complexType> <game:element name="电子竞技"> <game:complexType> <game:sequence> <game:element name="names" type="game_Name" /><!-- 6.引用复合类型 --> <game:element name="DOTA2" type="game:string" default="MOBA"/><!-- 1.设置默认值 --> <game:element name="DNF" type="game:string" fixed="ACT"/><!-- 1.设置固定值 --> <game:element name="CS"> <game:complexType> <game:attribute name="name" type="game:string" use="required"/><!-- 2.设置属性(属性需要设置在复合类型之中) --> </game:complexType> </game:element> <game:element name="return"><!-- 3.限定值 --> <game:simpleType> <game:restriction base="game:integer"> <game:minExclusive value="10"/> <game:maxExclusive value="100"/> </game:restriction> </game:simpleType> </game:element> <game:element name="sex"><!-- 4.通过枚举限定值 --> <game:simpleType> <game:restriction base="game:string"> <game:enumeration value="M"/> <game:enumeration value="F"/> </game:restriction> </game:simpleType> </game:element> <game:element name="word"><!-- 5.根据正则表达式限定值 --> <game:simpleType> <game:restriction base="game:string"> <game:pattern value="[a-z]"/> </game:restriction> </game:simpleType> </game:element> <game:element name="habit"><!-- 7.XSD仅含文本复合元素 --> <game:complexType> <game:simpleContent> <game:extension base="game:string"> <game:attribute name="country" type="game:string"/> </game:extension> </game:simpleContent> </game:complexType> </game:element> </game:sequence> </game:complexType> </game:element> </game:schema>


xml文件

<?xml version="1.0" encoding="UTF-8"?> <xx:电子竞技 xmlns:xx="http://www.example.org/asd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/asd asd.xsd"> <xx:names> <xx:刀塔></xx:刀塔> <xx:英雄联盟></xx:英雄联盟> <xx:反恐精英></xx:反恐精英> </xx:names> <xx:DOTA2>MOBA</xx:DOTA2><!-- 设置默认值为MOBA --> <xx:DNF>ACT</xx:DNF><!-- 设置固定值为ACT(缺省也为ACT) --> <xx:CS name="electric"></xx:CS> <xx:return>11</xx:return> <xx:sex>M</xx:sex> <xx:word>a</xx:word> <xx:habit>DOTA2</xx:habit> </xx:电子竞技>


其他(补充,any和anyattribute):

xsd文件

cl.xsd

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3cschool.cn" xmlns="http://www.w3cschool.cn" elementFormDefault="qualified"> <xs:element name="children"> <xs:complexType> <xs:sequence> <xs:element name="childname" type="xs:string" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:attribute name="name"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="Retror|Cold"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:schema>

persons.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://person.cn/p"
xmlns="http://person.cn/p"
elementFormDefault="qualified">

<xs:element name="persons">
</xs:element>

</xs:schema>


xn.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/xn" 
 xmlns="http://www.example.org/xn" 
 elementFormDefault="qualified">
 
<xs:element name="sex" type="xs:string"/>
<xs:element name="gender" substitutionGroup="sex"/><!-- 元素替换的操作 -->
 
 <xs:element name="person">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        <xs:element ref="sex"/><!-- 引用 需要在扩展之前--> 
        <xs:any minOccurs="0"/><!-- 扩展元素 -->
      </xs:sequence>
      <xs:anyAttribute/><!-- 扩展属性 -->
   </xs:complexType>
 </xs:element>
</xs:schema>


xn.xml

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://person.cn/p" 
	xmlns:p="http://www.example.org/xn"
	xmlns:c="http://www.w3cschool.cn"
	xsi:schemaLocation="http://www.example.org/xn xn.xsd http://www.w3cschool.cn cl.xsd http://person.cn/p persons.xsd">

	<p:person c:name="Retror">
	  <p:firstname></p:firstname>
	  <p:lastname></p:lastname>
	  <p:gender></p:gender>
	  <c:children>
	    <c:childname>xxx</c:childname>
	  </c:children>
	</p:person>
</persons>


希望能帮到大家!

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...