我想知道为什么我们必须使用对我们组织来说唯一的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>
答案 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>