XML命名空间冲突

时间:2016-02-15 13:52:02

标签: xml xml-namespaces

我想知道为什么我们必须使用对我们组织来说唯一的URI定义我们的命名空间(就像Java中的包一样)。这显然是有道理的,让我们避免名称冲突。但是,this page说:

  

对于相同的前缀,也可以(尽管不推荐)   到不同的名称空间,取决于他们的上下文

所以基本上如果我有自己的XML文档,我自己的命名空间前缀myNamespace定义为http://hisdomain.com/test,有人可以重新定义'myNamespace'前缀以指向他自己的命名空间http://hisdomain.com/test即使是错误的(我认为如果我定义了文档中已经定义的名称空间前缀,则没有警告。)

即使使用URI,其他人也需要确保他们不使用我的前缀!

然后使用URI并且必须为命名空间提供定义变得无用,如果我们只使用前缀而不必使用xlns属性提供定义,则命名空间系统同样可以正常工作。

如果我理解正确,则不允许这样做:

<root xmlns:abc="mydomain.com/test" xmlns:abc="yourdomain.com/test">
...
</root>

但是这个还可以 - 你可以在你的域名中重新定义abc前缀。

<root xmlns:abc="mydomain.com/test">
    <body xmlns:abc="yourdomain.com/test">
    ...//to use my namespace here, I'd need to redefine it again to mydomain.com/test

    </body>
</root>

1 个答案:

答案 0 :(得分:4)

  

即使使用URI,其他人也需要确保他们不使用我的   前缀!

在XML文档中,正确的名称空间前缀声明不应该发生冲突。

然而,关键是命名空间前缀本身是无关紧要的。它是完整命名空间名称的语法糖。符合条件的XML处理器不关心您或其他方使用的名称空间前缀。命名空间前缀只是简写方便;命名空间名称是重要的。

  

然后使用URI并且必须为命名空间提供定义   如果我们变得无用,命名空间系统将同样有效   只需使用前缀而无需提供定义   使用xlns属性。

不正确。

如果组件名称必须足够长以支持命名空间名称的唯一性要求,那么命名空间系统将无法正常工作。我们不喜欢额外的冗长。

更新新增问题:

正确,这是不允许的(类似于两个属性对于给定元素的名称不同):

<root xmlns:abc="mydomain.com/test" xmlns:abc="yourdomain.com/test">

但这是允许的(但最好避免):

<root xmlns:abc="mydomain.com/test">
    <body xmlns:abc="yourdomain.com/test">
    ...//to use my namespace here, I'd need to redefine it again to mydomain.com/test

    </body>
</root>