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

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/axyz/p/1970199.html
Copyright © 2011-2022 走看看