一、XML的两种约束DTD和Schema 摘自IBM官网一段话:“XML DTD(XML的文档类型定义)是近几年来XML技术领域所使用的最广泛的一种模式。可是由于XML DTD并不能全然满足XML自己主动化处理的要求。比如不能非常好实现应用程序不同模间的相互协调。缺乏对文档结构、属性、数据类型等约束的足够描写叙述等等。所以W3C于2001年5月正式推荐XML Schema为XML 的标准模式。显然,W3C希望以XML Schema来作为XML模式描写叙述语言的主流,并逐渐取代XML DTD”。可见Schema使用的越来越多。本文先阐述Shema约束中非常重要的概念命名空间。二、shema文件 student.xsd <?
xml version="1.0" encoding="UTF-8"?
>
<schemaxmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/student"elementFormDefault="qualified"><element name="student"><complexType><sequence><element name="num" type="int" /><element name="name" type="string" /><element name="birthday" type="date" /></sequence></complexType></element> </schema> student.xsd就是一个shema文件,本身也是XML格式的。也要符合一定的约束。通过几个问题来理解xmlns和targetNamespace。
问题1怎样保证shema文件唯一性:targetNamespace 由于在引用shema文件作为xml约束时,试想若有多个shema文件同名以哪一个约束为准呢?所以shema通过命名空间的概念来确保唯一性。targetNamespace属性就是指定这个xsd的命名空间的。 通常使用url的形式作为targetNamespace的值来确保唯一性。而该url通常并不一定存在。 问题2怎样引入shema规范:xmlns xsd全部的标签和属性也必须符合schema规范。那element、complexType、sequence等标签的规范从何而来呢? 通过xmlns属性来指定shema约束。xmlns="http://www.w3.org/2001/XMLSchema"就表示student.xsd默认不加前缀的标签和属性必须符合w3s定义的一个schema约束。若shema文件不是w3c组织定义的就须要指定shema文件的位置。以下xml引入student.xsd约束时有介绍。
问题3elementFormDefault是什么意思 该属性是一个枚举值:qualified、unqualified。默认是unqualified表示仅仅关联根标签student,而qualified表示关联全部标签和属性如num,name,birthday。
三、XML文件引入约束 方法1 student.xml <?xml version="1.0" encoding="UTF-8"?>
<student xmlns="http://www.example.org/student" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.example.org/student student.xsd"><num>1000</num><name>xy</name><birthday>2000-01-01</birthday> </student> student.xml指定了xmlns="http://www.example.org/student"约束,就是自己定义的student.xsd。但正如问题②所说shema文件不是w3c组织定义的就须要指定shema文件的位置。问题4怎样指定xsd位置:schemaLocation 通过schemaLocation指定shema文件位置。但schemaLocation属性由http://www.w3.org/2001/XMLSchema-instance约束,所以须要再通过xmlns引入这个约束。但一个标签中仅仅同意一个不带前缀的xmlns标签。所以要给新的xmlns带一个前缀xsi。前缀名自己定义。以下的样例非常好的说明了前缀的使用方法:
<?xml version="1.0" encoding="UTF-8"?> <xy:studentxmlns:xy="http://www.example.org/student"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.example.org/student student.xsd"><xy:num>1000</xy:num><xy:name>xy</xy:name><xy:birthday>2000-01-01</xy:birthday> </xy:student>方法2 没有通过指定shema的命名空间而是xsd问位置来确定约束。 <?xml version="1.0" encoding="UTF-8"?> <xy:studentxmlns:xy="http://www.example.org/student" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="/studnet.xsd"><xy:num>1000</xy:num><xy:name>xy</xy:name><xy:birthday>2000-01-01</xy:birthday> </xy:student>
首段摘自:http://www.ibm.com/developerworks/cn/xml/x-sd/