XML命名空间的问题

来源:互联网 发布:ajax模拟数据 编辑:程序博客网 时间:2024/05/03 22:31

一直对XML文件中的命名空间问题不清楚,或许今天问题得到了解决。

    首先,命名空间是Schema中引入的概念,为了解决DTD无法处理的“命名冲突”问题。

    其次,为一个元素定义了Namespace则它的所有的子元素都会使用相同的Namespace。

 

命名空间的唯一标识——URL

    Schema规范中的命名空间的值必须用 URI (统一资源标志符) 指代,一般我们使用URL作为NameSpace。但是Parser并不会从中读取任何信息。使用URL只是为了NameSpace的唯一性当然,人们可以通过URL提供的网址寻找相关的信息。 使用URI (比如 "http://www.w3.org/1999/xhtml") 去标示一个命名空间, 而不是用一个简短的字串 (比如"xhtml"), 这样做是为了减少不同命名空间标示符冲突的可能性。

 

XML Schema的导言

XML schema的开头时是一些导言,之后才是正式的声明。在schema 元素的导言中可能包含三个可选的属性。

例如,下面的语法使用的schema元素引用了三个最常使用的命名空间:

xmlns="http://www.w3c.org/2001/XMLSchema"

xmlns:xsd="http://www.w3c.org/2001/XMLSchema-datatypes"

xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instances"
前两个属性用XML命名空间来标识W3C中的两个XML schema规范。第一个 xmlns属性包含了基本的XMLschema元素,比如element, attribute, complexType, group,simpleType等。第二个xmlns属性定义了标准的XML schema属性类型例如string, float, integer等。

缺省命名空间

对于任何一个XML Schema定义文档(XSD)都有一个最顶层的schema (XSD)元素。而且该schema (XSD)元素定义必须包含命名空间: http://www.w3.org/2001/XMLSchema

作为命名空间的标识符(在声明中作为元素或属性的前缀),你也可以不使用xsd或xsi。

 

下面我们分别来观察Schema和XML实例文档中相关的命名空间。

比如前面介绍student.xsd的导言是这样的:

< schema

  xmlns="http://www.w3.org/2001/XMLSchema"

  xmlns:sl="http://www.xml.org.cn/namespaces/StudentList"

  targetNamespace="http://www.xml.org.cn/namespaces/StudentList"

>

  xmlns="http://www.w3.org/2001/XMLSchema"这是标准命名空间,解析器的确会去找的,但由于它是W3C的标准,所以我想每个XML的解析器都应该有一个备份。

  这里的targetNamespace属性表示了该shema所对应的命名空间的URI。也就是说在引用该Schema的其它文档中要声明命名空间,其URI应该是targetNamespace的属性值。

  例如在这里因为要用到student.xsd自己定义的扩展数据类型,所以也声明的命名空间xmlns:sl="http://www.xml.org.cn/namespaces/StudentList"。

我们再来看由该schema规定的XML文档的开头将是什么样子:

<studentlst

  xmlns="http://www.xml.org.cn/namespaces/StudentList"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.xml.org.cn/namespaces/StudentList student.xsd"

>

其中缺省命名空间声明xmlns="http://www.xml.org.cn/namespaces/StudentList"就是和刚刚声明的XML Schema的命名空间相结合来规定该XML文档。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是任何XML实例文档固有的命名空间,当然按照前面所说的命名空间名称xsi是可以自己规定的。

而xsi:schemaLocation="http://www.xml.org.cn/namespaces/StudentList student.xsd"则规定了该命名空间所对象的schema的位置,即在相同路径的student.xsd文件。

 

根据上面的知识解析下面的XML文件:

<?xml version="1.0"?>
<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

根元素中的几个属性都指什么含义? 请看下面的解析:

xmlns="http://www.w3schools.com"

此句说明文档的默认命名空间是“http://www.w3schools.com”。

“文档的默认命名空间”,语法是:xmlns="namespaceURI",可用来简化前缀

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

这里定义一个Schema的实例命名空间。只有作了这个定义才能使用schemaLocation属性。

xsi是XML Schema Instance的意思,该命名空间是专门为只在实例文档中使用的属性而保留的。因为schemaLocation是在这个命名空间中的,所以要引用它。

xsi:schemaLocation="http://www.w3schools.com note.xsd"

如上所述,因为我们已经定义了xsi命名空间所以可以使用schemaLocation属性了。

schemaLocation属性由成对的值组成可以有多对。

(因为一个XML文档可以有多个命名空间,所以schemaLocation值可以有多对)

第一个值“http://www.w3schools.com”是要使用schema进行有效验证的命名空间的元素。

第二个值“note.xsd”是要使用的schema文档的路径。

 

 

 

原创粉丝点击