码迷,mamicode.com
首页 > 其他好文 > 详细

xml中约束和命名空间的区别

时间:2015-09-06 09:43:19      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

    在学习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>

xml中约束和命名空间的区别

标签:

原文地址:http://www.cnblogs.com/ccharp/p/4784486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!