标签:
在学习xml的时候接触到了xml约束,因为xml的编写非常灵活,所以我们一般会编写一个文档来约束xml文档的书写规范,而这个约束xml文档的文档就成为xml约束,目前有两种约束方式,分别为DTD和SCHEAM,前者比较古老,且不能完全满足xml自动处理的要求(这句话不太理解),后者是w3c组织2001年正是推荐开发者使用,可以很好的对文档的属性,数据类型,结构等方面的描述,下面举例说明:
这个是很简单的描述一本书的xml,它使用的是dtd约束
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java编程思想</书名>
<作者>张三</作者>
<售价>89.00元</售价>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>李四</作者>
<售价>28.00元</售价>
</书>
</书架>
它的约束book.dtd是这样写的,大家一看就应该一目了然,比较好理解
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
相比而言,我们看看一个schema的约束是怎么写的
book.xsd
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="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="prices" type="int" />
</sequence>
</complexType>
</element>
</schema>
schema约束本身也是一个xml,它也有自己的约束,我们不关注这一点,下面我们通过几个问题来看看它其中的几个重要属性
问题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。
问题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:student
xmlns: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>
标签:
原文地址:http://www.cnblogs.com/ccharp/p/4784486.html