【问题标题】:understanding xml namespaces理解 xml 命名空间
【发布时间】:2021-08-26 13:46:55
【问题描述】:

您好,我在理解命名空间和默认命名空间如何在 xml 中工作时遇到问题

在下面的示例中,我看到了 2 个默认命名空间(recherche 和 mots-clefs)和 2 个命名空间(xmlns:yahoo 和 xmlns:yahoo2,对吗?

<?xml version="1.0"?> 
<recherche xmlns="http://www.google.com/" xmlns:yahoo="http://www.yahoo.com/">
  <mots-clefs xmlns="http://www.yahoo.com/">fraise, orange</mots-clefs>
  <yahoo:mot xmlns:yahoo2="http://www.yahoo.com/">
    <nombre>3</nombre> 
  </yahoo:mot> 
</recherche>

【问题讨论】:

  • 对于您的 yahoo:mot 元素,由于 yahoo.com 命名空间在 recherche 祖先中声明,并带有 yahoo 前缀,并且用于 yahoo:mot,因此不需要有xmlns:yahoo2="http://www.yahoo.com/"。它只是创建另一个(未使用的)命名空间前缀,绑定到已声明的同一个命名空间。这只是混乱。将命名空间前缀视为变量,命名空间是分配的值。如果它们具有相同的值,则不需要 yahoo 和 yahoo2。

标签: xml xml-namespaces


【解决方案1】:

是的,XML 维护两个默认命名空间定义和两个命名空间前缀定义。由于两者的重叠存在,底层标签具有细微的作用域继承。

根据关于 Namespace Scoping 的 XML 1.0 规范:

声明前缀的命名空间声明的范围从它出现的开始标记的开头延伸到相应的结束标记的结尾,不包括具有相同 NSAttName 部分的任何内部声明的范围。在空标签的情况下,范围是标签本身。

这样的命名空间声明适用于其范围内前缀与声明中指定的前缀匹配的所有元素和属性名称。

与前缀元素或属性名称对应的扩展名称具有前缀绑定到的 URI 作为其命名空间名称,本地部分作为其本地名称。

因此,虽然您发布的 XML 中有两个默认命名空间,但内部声明的默认命名空间在范围内取代了外部默认命名空间,但仅适用于该特定标记及其后代。

此外,任何打算解析根 &lt;recherche&gt; 及其所有非前缀标记的后代内容的 DOM 库方法都必须确认 Google URI。但是,对于 &lt;mots-clefs&gt; 及其所有非前缀后代(除了文本节点之外都没有)必须使用 Yahoo URI 的当前默认命名空间范围。

为了进一步说明,请参阅 XML 缩进版本中的命名空间范围 cmets。请注意,&lt;nombre&gt; 标记是 &lt;recherche&gt; 的后代,并且没有冒号分隔的前缀将默认为第一个声明的默认命名空间。

<?xml version="1.0"?>                                                           <!-- NMSP SCOPES: -->
<recherche xmlns="http://www.google.com/" xmlns:yahoo="http://www.yahoo.com/">  <!-- GOOGLE URI   -->
    <mots-clefs xmlns="http://www.yahoo.com/">fraise, orange</mots-clefs>       <!-- YAHOO URI    -->
    <yahoo:mot xmlns:yahoo2="http://www.yahoo.com/">                            <!-- YAHOO PREFIX -->
        <nombre>3</nombre>                                                      <!-- GOOGLE URI   -->
    </yahoo:mot> 
</recherche>

【讨论】:

    【解决方案2】:

    声明了 2 个不同的命名空间:

    1. http://www.google.com/
    2. http://www.yahoo.com/

    有两个命名空间前缀,都绑定到http://www.yahoo.com/命名空间:

    1. 雅虎
    2. yahoo2

    有些元素声明时没有命名空间前缀,但仍绑定到命名空间:

    注意nombre 元素绑定到http://www.google.com/ 命名空间,因为它没有命名空间前缀,并且第一个没有命名空间前缀recherche 的祖先的命名空间设置为@ 987654329@.

    在 XPath 中,您可以使用 namespace-uri() 函数询问元素的命名空间是什么。

    由于命名空间是如何继承的,当人们使用混合命名空间并且不使用命名空间前缀时,可能会造成混淆(并且容易出错)。一般来说,最好的做法是应用命名空间前缀以避免这种混淆。

    如果您是手动编码 XML,则设置不带前缀的命名空间有助于更轻松地构造 XML 并避免重复相同的事情。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2011-04-17
      • 2021-05-03
      • 2014-01-10
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多