一个XML文档可以引入多个约束文档,但是,由于约束文档中的元素或属性都是自定义的,因此,在XML文档中,极有可能出现代表不同含义的同名元素或属性,导致名称发生冲突。为此,在XML文档中,提供了名称空间,它可以唯一标识一个元素或者属性。这就好比打车去小营,由于北京有两个地方叫小营,为了避免司机走错,我们总会说去“去亚运村的小营”或者“去清河的小营”。这时的亚运村或者清河就相当于一个名称空间。
在使用名称空间时,首先必须声明名称空间。名称空间的声明就是在XML实例文档中为某个模式文档的名称空间指定一个临时的简写名称,它通过一系列的保留属性来声明,这种属性的名字必须是以“xmlns”或者以“xmlns:”作为前缀。它与其它任何XML属性一样,都可以通过直接或者使用默认的方式给出。名称空间声明的语法格式如下所示:
<元素名 xmlns:prefixname="URI">
在上述语法格式中,元素名指的是在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及该元素中嵌套的所有元素及其属性。xmlns:prefixname指的是该元素的属性名,它所对应的值是一个URI引用,用来标识该名称空间的名称。需要注意的是,如果有两个URI并且其组成的字符完全相同,就可以认为它们标识的是同一个名称空间。
了解了名称空间的声明方式,接下来,通过一个案例来学习,如例1所示。
例1 book.xml
<?xml version="1.0" encoding="UTF-8"?> <it315:书架 xmlns:it315="http://www.it315.org/xmlbook/schema"> <it315:书> <it315:书名>JavaScript网页开发</it315:书名> <it315:作者>张孝祥</it315:作者> <it315:售价>28.00元</it315:售价> </it315:书> </it315:书架>
在例1中,it315被作为多个元素名称的前缀部分,必须通过名称空间声明将它关联到唯一标识某个名称空间的URI上,xmlns:it315="http://www.it315.org/xmlbook/schema"语句就是将前缀名it315关联到名称空间"http://www.it315.org/xmlbook/schema"上。由此可见,名称空间的应用就是将一个前缀(如it315)绑定到代表某个名称空间的URI(如http://www.it315.org/xmlbook/schema)上,然后将前缀添加到元素名称的前面(例如,it315:书)来说明该元素属于哪个模式文档。
需要注意的是,在声明名称空间时,有两个前缀是不允许使用的,它们是xml和xmlns。xml前缀被定义为与名称空间名字http://www.w3.org/XML/1998/namespace绑定,只能用于XML1.0规范中定义的xml:space和xml:lang属性。前缀xmlns仅仅用于声明名称空间的绑定,它被定义为与名称空间名字http://www.w3.org/2000/xmlns绑定。
默认名称空间
如果一个文档有很多元素,并且这些元素都在同一个名称空间,这时,给每个元素名称都添加一个前缀将是一件非常繁琐的事情。这时可以使用默认的名称空间,默认名称空间声明的语法格式如下所示:
<元素名 xmls="URI">
在上面的语法格式中,URI所标识的是默认的名称空间。以这种方式声明的空间名称将作为其作用域内所有元素的默认名称空间。接下来,对例1进行修改,将book.xml改为默认名称空间的形式,如例2所示。
例2 book.xml
<?xml version="1.0"encoding="UTF-8"?> <书架 xmlns="http://www.it315.org/xmlbook/schema"> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>
在例2中,虽然“书架”、“书”、“书名”、“作者”、“售价”等元素名称前面没有前缀,但是由于"http://www.it315.org/xmlbook/schema"被设置成了默认的名称空间,所以,它们仍然是"http://www.it315.org/xmlbook/schema"这个URI所标识的名称空间中的元素。虽然使用默认名称空间会减少一些书写工作量,而使用带前缀的非默认名称空间会增加一些书写工作量,但合理地命名前缀却可以为人们浏览 XML文档时提供便利,例如,book:title很容易让人联想到title是book 词汇表中定义的元素。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253881.html