转自:http://happylongnv.blog.hexun.com/48859954_d.html
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等等一大批元素,当我们要使用这些元素或它定义的变量时,就必须引用该命名空间。