zoukankan      html  css  js  c++  java
  • 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.w3.org/1999/xhtml">

    <head>

    <title>Virtual Library</title>

    </head>

    <body>

    <p>Moved to <a href="http://example.org/">example.org</a>.</p>

    </body>

    </html>

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

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <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.blabla.cn/addresses">

    <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.woyouxian.com" xmlns:ISBN="http://www.blabla.cn/isbn">

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

    </site>

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

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

    <feed xmlns='http://www.w3.org/2005/Atom'

    xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>

    <id>tag:blabla.cn,2008:atom-1234567890</id>

    <title type='text'>Blabla Atom</title>

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

    <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://www.blabla.cn'>EP</a:employee>

    <b:employee xmlns:b='http://www.blabla.cn'>TSE</b:employee>

    </org>

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

    <h:memo xmlns:a='http://www.blabla.cn'>

    <h:body xmlns:a='http://www.w3.org/1999/xhtml'>

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

    </h:body>

    </h:memo>

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

    <org xmlns:a='http://www.blabla.cn' xmlns:b='http://www.blabla.cn'>

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

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

    </org>

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

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

    规范使用名字空间

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

    <memo xmlns='http://www.blabla.cn' xmlns:html='http://www.w3.org/1999/xhtml'>

    <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

  • 相关阅读:
    <a>标签实现锚点跳跃,<a>标签实现href不跳跃另外加事件(ref传参)
    ThinkPHP实现事务回滚示例代码(附加:PDO的事务处理)
    python 命令执行文件传递参数
    python os.walk()
    python sys.stdin、sys.stdout和sys.stderr
    Python 为什么sys.stdout.write 输出时后面总跟一个数字
    python 不同集合上元素的迭代 chain()
    Python zip() 处理多于两个序列的参数, 存储结对的值
    Python 成对处理数据 zip()
    python 同时迭代多个序列
  • 原文地址:https://www.cnblogs.com/axyz/p/1970199.html
Copyright © 2011-2022 走看看