Xml名称空间

所谓 Xml 名称空间 (Namespace) ,就是可以为 Xml Tag 或者属性增加一个前缀,例如 a:book b:name ,这里的 a b 就是前缀。为了区分前缀,每个前缀可以用一个唯一的 URI 来区分,用 xmlns 这个属性定义在 Xml 节点上。可以用下面两种语法定义前缀。

 

    * xmlns: 前缀 ="URI"

    * xmlns="URI"

 

前一种语法将前缀与 URI 相关联,后一种语法为没有前缀的元素指定一个缺省名称空间 (Namespace) 。这里的 URI 只是一个可以唯一识别的字符串,所指向的网页并不对 Xml 文件产生影响。

 

举一个非常常见的缺省名称空间 (Namespace) 的例子。

<html xmlns="http://www.sothink.com/product/flashdecompiler/index.htm">

  <head>

    <title>Virtual Library</title>

  </head>

  <body>

    <p>Moved to <a href="http://www.sothink.com/product/flashdecompiler/index.htm">www.sothink.com</a>.</p>

  </body>

</html>

 

再举一个非常常见的使用前缀的名称空间 (Namespace) 的例子,前缀是 xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.sothink.com/product/flashdecompiler/index.htm">

  <xsl:template match="/">

  <html>

  <body>

    <h2>My CD Collection</h2>

    <table>

    <tr><th>Title</th><th>Artist</th></tr>

    <xsl:for-each select="catalog/cd">

    <tr><td><xsl:value-of select="title"/></td><td><xsl:value-of select="artist"/></td></tr>

    </xsl:for-each>

    </table>

  </body>

  </html>

  </xsl:template>

</xsl:stylesheet>

 

Xml 名称空间 (Namespace) 的混合使用

 

Xml 规范的介绍中说, Xml 名字空间 (Namespace) 的作用主要是为了消除歧义,因为不同的 Xml 语句部分可能具有相同名字的 Tag ,通过使用 Xml 名字空间 (Namespace) ,可以为软件开发带来方便。举例而言,下面的例子中两个 Xml 部分都有 Address ,通过名字空间可以很清楚的分开他们。

 

<Department>

  <Name>DVS1</Name>

  <addr:Address xmlns:addr=" http://www.sothink.com/product/flash-decompiler-for-mac/index.htm ">

    <addr:Street>Wilhelminenstr. 7</addr:Street>

    <addr:City>Darmstadt</addr:City>

    <addr:State>Hessen</addr:State>

    <addr:Country>Germany</addr:Country>

    <addr:PostalCode>D-64285</addr:PostalCode>

  </addr:Address>

  <serv:Server xmlns:serv="http://www.blabla.cn/servers">

    <serv:Name>OurWebServer</serv:Name>

    <serv:Address>123.45.67.8</serv:Address>

  </serv:Server>

</Department>

 

但问题是,如果没有名称空间 (Namespace) ,把上述示例写成下面的代码,虽然可以清楚地看到存在明显的冲突,但是显然下面的 Xml 代码更加清晰,而且对软件编写不会造成什么困扰。 Xml 是树状结构,不仅仅可以通过 Tag 的名字来找到需要的元素,还可以通过上下文关系和文档结构找到元素,因此消除歧义并不需要 Xml 名称空间 (Namespace)

 

<Department>

  <Name>DVS1</Name>

  <Address>

    <Street>Wilhelminenstr. 7</Street>

     <City>Darmstadt</City>

    <State>Hessen</State>

    <Country>Germany</Country>

    <PostalCode>D-64285</PostalCode>

  </Address>

  <Server>

    <Name>OurWebServer</Name>

    <Address>123.45.67.8</Address>

  </Server>

</Department>

 

比较好的名称空间 (Namespace) 的混合使用

 

看下面的例子:

 

<site xmlns="http://www.sothink.com/product/flash-decompiler-for-mac/index.htm" xmlns:ISBN="http://www.sothink.com/product/swfcatcher/firefox/index.php">

  <book id="0013" caption="A Tale of Two Cities" ISBN:id="1234567890" />

</site>

 

site book 都与缺省名字空间“ http://www.sothink.com/product/flash-decompiler-for-mac/index.htm ”关联,而由于前缀 ISBN 的引入, book 可以有两个 id 的属性,一个是 id ,一个是 ISBN:id ,这样就解决了名字相同的冲突。这是一个很纯粹的“书本上的例子”,能帮助理解,但是看不出实际上的用途。

 

下面是一个实际当中的名称空间 (Namespace) 混合使用的例子。这是一个 Atom 引擎返回的结果,缺省名称空间 (Namespace) http://www.sothink.com/product/swfcatcher/ie/ ,当中的 Tag 和属性是给术语订阅软件使用;而名称空间 http://www.sothink.com/product/swfcatcher/safari/index.php 中的 Tag 是给 OpenSearch 这个服务使用的,从而让 Atom 引擎支持 OpenSearch 。在这个例子中,通过名称空间 (Namespace) 的使用,一个 Xml 文件支持了两个不同服务商写的不同软件。

 

<feed xmlns=' http://www.sothink.com/product/swfcatcher/ie/ '

  xmlns:openSearch='http://www.sothink.com/product/swfcatcher/safari/index.php'>

  <id>tag:sothink.com,2008:atom-1234567890</id>

  <title type='text'>SWF Decompiler</title>

  <link rel='alternate' type='text/html' href='http://www.sothink.com/'/>

  <openSearch:totalResults>50</openSearch:totalResults>

  <openSearch:startIndex>1</openSearch:startIndex>

  <openSearch:itemsPerPage>25</openSearch:itemsPerPage>

  <entry>

     ...

  </entry>

</feed>

 

不要在名称空间 (Namespace) 上找麻烦

 

Xml 名称空间 (Namespace) 规范是最受争议的 Xml 基础规范之一。据说 Xml 开发人员中并没有多少人认为自己确实理解了它,在各种 Xml 开发人员邮件列表中经常出现对它的尖刻批评。 Xml 名称空间 (Namespace) 定义的太过自由,让用户可以非常随意的使用,从而出现大量令人难以接受的 Xml 文本。

 

多个前缀映射到同一个名称空间,这是一个很坏的例子。

 

<org>

  <a:employee xmlns:a='http://mac.sothink.com'>EP</a:employee>

  <b:employee xmlns:b='http://mac.sothink.com'>TSE</b:employee>

</org>

 

同一个前缀则用于多个名称空间,这是另外一个很坏的例子。

 

<h:memo xmlns:a='http://mac.sothink.com'>

  <h:body xmlns:a='http://www.sothink.com/product/swfcatcher/safari/index.php'>

    Now hear <h:i>this</h:i>

  </h:body>

</h:memo>

 

同一名称空间声明了两个不同的前缀,这又是一个很坏的例子。

 

<org xmlns:a='http://mac.sothink.com' xmlns:b= 'http://mac.sothink.com'>

  <a:employee>EP</a:employee>

  <b:employee>TSE</b:employee>

</org>

 

遗憾的是,从 Xml 名称空间 (Namespace) 的规范来说,都是允许的。这些文本不但让人类难以理解,对软件而言,也是很灾难性的。

 

1999 年, Xhtml 1.0 成为最终的建议标准,标准有三种不同的变体,使用三个不同的名称空间。这一决策引起了强烈的反对。因为三个变体之间差别是非常细节的,而过多的名字空间 (Namespace) 会对程序开发造成各种麻烦。最后, Xhtml 工作组发布了新的规范,使用单一名称空间。这个事件告诉大家,不要在名称空间 (Namespace) 上找麻烦,能简化就简化,只有事情存在真正的区别时才在名称空间 (Namespace) 上加以区分。

规范使用名字空间

 

一个大家比较公认的 Xml 名称空间 (Namespace) 的使用建议是,把所有的名称空间声明都写在根元素中,而且不要为同一名称空间声明两个不同的前缀。比如下面的 Xml 文本就是比较好的文本。

 

<memo xmlns='http://www.sothink.com' xmlns:html='http://www.sothink.com/product/flashdecompiler/index.htm'>

  <html:body>

    Now hear <html:i>this</html:i>

  </html:body>

</memo>

 

当然作为一般的 Xml 文件,彻底不用名称空间 (Namespace) 可能是更好的建议。

 

如果你是 W3C ,制定出标准来,那用一个名称空间 (Namespace) 也就用吧。下面列出 W3C 指定的一些常用名字空间。

前缀          URI

xml   http://www.w3.org/XML/1998/namespace

xsl    http://www.w3.org/1999/XSL/Transform

fo      http://www.w3.org/1999/XSL/Format

xsd   http://www.w3.org/2001/XMLSchema

html http://www.w3.org/1999/xhtml

svg   http://www.w3.org/2000/svg

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值