xmlns=""是一个有效的XML命名空间吗?

28

“empty”是否是XML命名空间的有效值?如果是,它代表什么意思?

我有以下XML代码,但我不确定Field1Field2元素属于哪个命名空间。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header />
  <soap:Body>
    <Root xmlns="uri">
      <Field1 xmlns="">147079737</Field1>
      <Field2 xmlns="">POL</Field2>
    </Root>
  </soap:Body>
</soapenv:Envelope>

2
一个有趣的问题。如果不合法,那么如何为其父元素在命名空间中的元素指定“无命名空间”? - skaffman
10
@skaffman说:这是合法的,而且这是将一个元素引入全局命名空间的方法。 - Frerich Raabe
4
我同意@Frerich Raabe的观点:如果没有这个方法,你就无法摆脱后代节点中继承的命名空间。 - Tomalak
1
根据XML规范,我的理解是这不会将命名空间设置为全局命名空间,而是作用于特定的命名空间。我错了吗? - Sergej Andrejev
2个回答

29

是的,这是有效的。XML 1.0推荐规范中的命名空间第6.2节明确指出:

默认命名空间声明中的属性值可以为空。在声明的范围内,这与没有默认命名空间的效果相同。

引用自评论:

这是合法的,并且这是将元素引入全局命名空间的方法。


但是上面的代码是一个默认命名空间声明吗? - Brian Agnew
@Brian:是的,可以在我回答中提供的链接中查看《XML 1.0 Recommendation》的第3节中的第3个定义。它说:“[定义:如果属性名称与DefaultAttName匹配,则属性值中的命名空间名称是附加声明所属元素范围内的默认命名空间的名称]”。DefaultAttName被定义为“xmlns”。 - Frerich Raabe
在我的情况下,如果它与没有命名空间相同,那么它是什么命名空间?XML是否有预定义的默认命名空间,就像在我的情况下用户没有提供默认命名空间时使用的那个? - Sergej Andrejev
不,没有NS就是没有NS。请查看Ronald Bourret的“命名空间神话揭秘”(http://www.rpbourret.com/xml/NamespaceMyths.htm)。 - Ludovic Kuty
@Brian 这不是默认的命名空间。这是一个默认的命名空间未声明,因为正如规范所写:“在声明的范围内,这具有与没有默认命名空间相同的效果。” - Ludovic Kuty

5
这不是一个有效的XML NS。这不是一个有效的XML NS声明。请参考《XML 1.0中的命名空间》第2.2节

虽然它是合法的URI引用,但空字符串不能用作命名空间名称。

如果存在默认NS声明或者它没有任何效果,它是撤销默认NS声明的唯一方法。请查看XML 1.0和1.1中的命名空间第6.2节。1.1 NS修订版本添加了一种通过前缀也能够撤销NS声明的方式。
因此,它是xmlns特殊属性的一个有效值,但它不像OP所写的那样是“有效的XML命名空间”。

3
似乎你混淆了命名空间前缀和实际命名空间(命名空间URI)。空字符串不是有效的命名空间前缀,但是是有效的命名空间URI。 - vog
2
我不认为我会混淆任何事情。我知道它们之间的区别。顺便说一下,我看不出我的答案可能会暗示这一点。 - Ludovic Kuty
5
我认为你在回答一个问题,即空字符串是否是有效的命名空间名称。然而,楼主似乎在问空字符串是否是“xmlns”属性的有效值。也许这种不一致导致了两个相互矛盾的答案。 - Frerich Raabe
好的,这解释了一些事情。在原始问题中,OP混淆了声明和NS名称,而我则专注于NS名称而不是声明。 - Ludovic Kuty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接