XML命名空间初解

1. XML基本知识:

XML Schema语言也可作为XSD(XML Schema Definition)来引用

XML指可扩展标记语言(EXtensible Markup Language)

XML被设计用来传输和存储数据。

XML是独立于软件和硬件的信息传输工具

拥有正确语法的XML被称为“形式良好”的XML。

通过某个DTD进行了验证的XML是“合法”的XML。

XSLT (eXtensible Stylesheet Language Transformations)

XML命名空间并不是XML1.0标准的一部分,而是一个被称为"Namespace in XML"的独立标准。W3C组织于1998年2月提出XML命名空间标准的第一个草案,直到1999年1月14日才正式发布为推荐标准。

2. XML命名空间的由来

简单说来,制定XML命名空间标准的初衷是为了解决XML文档中命名的冲突问题。那么何为命名冲突问题呢?请看下面这个例子。

假设我们已有两个XML文档,"学生.xml"和"老师.xml",如下所示:

<?xml version ="1.0" encoding = "GB2312"?>

<学生>

<姓名>李明</姓名>

<班级>三年级二班</班级>

<住址>135楼210室</住址>

</学生>

<?xml version ="1.0" encoding = "GB2312"?>

<教师>

<姓名>李华</姓名>

<住址>432楼133室</住址>

<电话>(021)32566178</电话>

</教师>

下面我们希望把这两个XML文档的内容结合成一个新的XML文档--"新学生.xml",新XML文档如下所示:

<?xml version ="1.0" encoding = "GB2312"?>

<学生>

<姓名>李明</姓名>

<班级>三年级二班</班级>

<住址>135楼210室</住址>

<班主任>

<教师>

<姓名>李华</姓名>

<住址>432楼133室</住址>

<电话>(021)32566178</电话>

</教师>

</班主任>

</学生>

在这个新XML文档--"新学生.xml"中即出现了命名冲突的问题。"学生"元素的"姓名"子元素,其语义是"学生的姓名",而"教师"元素的"姓名"子元素的语义是"班主任教师的姓名"。"住址"的元素名也有同样的命名冲突问题。

解决命名冲突问题的一个直接的方法是,给重名的元素或属性重新命名。例如将上例中"教师"的"姓名"元素改为"教师姓名",然而这不是一种长期解决问题办法。在XML的实际应用中,人们常常为不同行业和领域用XML制定不同的语言标准,比如电子商务、远程教育、电子书都分别用XML制定了语言标准,然后针对不同的语言编写不同的模块化处理程序。通过重用现存的语言标准和处理程序,人们可以很快地定义出新的语言标准和处理程序。假如我们通过重新命名的方法解决名称冲突问题,那么我们将面临着,针对原名称开发的应用程序不可再利用的危险。

解决名称冲突的一个比较好的解决方案是,给不同的语言赋以不同的名称空间,应用程序通过名称空间来区分一个元素到底来自于那一个语言。XML命名空间就是对这种方案的具体实现。

3. XML命名空间的定义

XML命名空间解决命名冲突问题采用的方法是所谓"两段式命名法",其中第一段是代表特定命名空间的"命名空间前缀",第二段是元素或属性原来的名字,两段之间用冒号":"分开。用XML命名空间重写后的"新学生.xml"文档如下:

<?xml version ="1.0" encoding = "GB2312"?>

<学生:学生xmlns:学生= http://www.xml.net.cn/学生

xmlns:班主任= http://www.xml.net.cn/班主任>

<学生:姓名>李明</学生:姓名>

<学生:班级>三年级二班</学生:班级>

<学生:住址>135楼210室</学生:住址>

<学生:班主任>

<班主任:教师>

<班主任:姓名>李华</班主任:姓名>

<班主任:住址>432楼133室</班主任:住址>

<班主任:电话>(021)32566178</班主任:电话>

</班主任:教师>

</学生:班主任>

</学生:学生>

修改后的"新学生.xml"文档中,"姓名"和"住址"元素的名称前增加了"学生"和"班主任"这样的前缀,因此不再冲突。下面我们就对XML命名空间的定义作一说明。

XML命名空间的定义由命名空间的声明、"合法名称"的定义及应用、命名空间的作用域三部分组成。

(1)XML命名空间的声明

XML命名空间的声明是通过保留属性"xmlns"来实现的。上例中的

<学生:学生xmlns:学生= http://www.xml.net.cn/学生

xmlns:班主任= http://www.xml.net.cn/班主任>

就是命名空间声明。

命名空间声明有两种方式,即直接定义方式和缺省定义方式:

直接定义方式:  xmlns: [命名空间前缀] = [命名空间名]

缺省定义方式:  xmlns = [命名空间名]

命名空间声明中,等号右边的属性值部分是一个URI(Uniform Resource Identifier统一资源标识符)引用,其功能是区分不同的命名空间。因此,这个URI引用被称为命名空间名,它应该具有唯一性和持久性。虽然该属性值使用了URI,但其目的并不是要直接得到一个schema或DTD,主要的目的在于标识特定的命名空间。

命名空间声明中,等号左边的属性名部分,如果有用冒号":"分隔开的"命名空间前缀",就是直接定义方式,其中"命名空间前缀"是一个合法的XML名称。没有"命名空间前缀"的命名空间声明,就是缺省的命名空间声明。

命名空间声明将"命名空间名"与"命名空间前缀"绑定在一起。

(2)"合法名称"的定义和应用

在定义了命名空间的声明以后,对如何引用<命名空间前缀>构成新的元素名和属性名,需要再作进一步的统一规范,这就是所谓"合法名称"定义的由来。

"合法名称"由用西文冒号":"分开的前缀部分和本地部分组成,其中前缀部分和本地部分都是一个合法的XML名称。如:"班主任:姓名"。

"合法名称"的前缀部分,规定必须是一个"命名空间前缀",且这个命名空间前缀必须已经经过命名空间声明声明过,语法分析器会自动将其与声明中的URI引用相联系。冒号后的部分是该命名空间中定义的元素或属性名,提供了"合法名称"的本地部分。在用缺省方式声明命名空间时,由于"命名空间前缀"为空,因此,这时的"合法名称"只剩下本地部分。"新学生.xml"文档中,"http://www.xml.net.cn/学生"命名空间改为缺省命名空间后,如下所示:

<?xml version ="1.0" encoding = "GB2312"?>

<学生xmlns = http://www.xml.net.cn/学生

xmlns:班主任= http://www.xml.net.cn/班主任>

<姓名>李明</姓名>

<班级>三年级二班</班级>

<住址>135楼210室</住址>

<班主任>

<班主任:教师>

<班主任:姓名>李华</班主任:姓名>

<班主任:住址>432楼133室</班主任:住址>

<班主任:电话>(021)32566178</班主任:电话>

</班主任:教师>

</班主任>

</学生>

"合法名称"的应用主要有三种情况:

用于起始元素标记、结束元素标记和空元素标记。如前面例子所示。

用于属性的定义。

例如:

<?xml version ="1.0" encoding = "GB2312"?>

<学生:学生xmlns:学生= http://www.xml.net.cn/学生>

<学生:姓名>李明</学生:姓名>

<学生:班级学生:数字类型= "中文">三年级二班</学生:班级>

<学生:住址学生:数字类型= "阿拉伯">135楼210室</学生:住址>

</学生:学生>

用于DTD中的元素名和属性类型。

例如:

<?xml version="1.0" encoding="GB2312"?>

<!ELEMENT学生:学生(学生:姓名,学生:班级,学生:住址)>

<!ATTLIST学生:学生xmlns:学生

CDATA #FIXED "http://www.xml.net.cn/学生">

<!ELEMENT学生:姓名(#PCDATA)>

<!ELEMENT学生:班级(#PCDATA)>

<!ELEMENT学生:住址(#PCDATA)>

(3)命名空间的作用域

所谓命名空间的作用域范围是指,一个命名空间声明可以作用到哪些元素和属性。一般可以认为命名空间声明,能够作用到说明它的元素和该元素的所有内容元素,除非被其他命名空间声明所覆盖。再一次修改"新学生.xml"文档,将"http://www.xml.net.cn/班主任"命名空间移到"教师"元素中,如下所示:

<?xml version ="1.0" encoding = "GB2312"?>

<学生xmlns = http://www.xml.net.cn/学生>

<姓名>李明</姓名>

<班级>三年级二班</班级>

<住址>135楼210室</住址>

<班主任>

<班主任:教师xmlns:班主任= http://www.xml.net.cn/班主任>

<班主任:姓名>李华</班主任:姓名>

<班主任:住址>432楼133室</班主任:住址>

<班主任:电话>(021)32566178</班主任:电话>

</班主任:教师>

</班主任>

</学生>

缺省命名空间"http://www.xml.net.cn/学生"的作用域在"教师"元素以外的地方,而"http://www.xml.net.cn/班主任"命名空间的作用域在"教师"元素内,包括"教师"元素本身。

与XML命名空间相关的主要概念,讨论到这里基本上可以结束了。由于篇幅的关系,与XML命名空间相关的一些曾经引起争论的问题,如"命名空间与DTD",就不在这里讨论了。XML命名空间已经在XSLT、Xlink等标准中得到应用,它已经成为XML标准家族不可或缺的一员。

Note:

一个XSD可以没有命名空间。在一个XSD文件中,没有前缀限定的元素默认引用的是”xmlns”指定的命名空间的元素;命名空间“http://www.w3.org/2001/XMLSchema”是由w3c定义的,它定义了element、schema、complextType等等一大批元素,当我们要使用这些元素或它定义的变量时,就必须引用该命名空间。

来自:http://happylongnv.blog.hexun.com/48859954_d.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值