xmlns="" 是有效的 xml 命名空间吗?

Posted

技术标签:

【中文标题】xmlns="" 是有效的 xml 命名空间吗?【英文标题】:Is xmlns="" a valid xml namespace? 【发布时间】:2010-12-07 22:57:32 【问题描述】:

“空”是 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>

【问题讨论】:

一个有趣的问题。如果它不合法,那么如何为父 在命名空间中的元素指定“无命名空间”? @skaffman:这是合法的,这是将元素带入全局命名空间的方式。 我同意@Frerich Raabe:没有它,你将无法摆脱后代节点中继承的命名空间。 正如我从 XML 规范中了解到的那样,这不会将命名空间设置为全局命名空间,而是将其设置为范围命名空间。我错了吗? 【参考方案1】:

是的,它是有效的。 Section 6.2 在Namespaces in XML 1.0 Recommendation 中明确表示:

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

引自评论:

这是合法的,这是将元素带入全局命名空间的方式。

【讨论】:

但是上面是 default 命名空间声明吗? @Brian:是的;请参阅我在答案中链接的“XML 1.0 建议中的命名空间”第 3 节中的定义 3。它说“[定义:如果属性名称与 DefaultAttName 匹配,则属性值中的名称空间名称是声明所附加到的元素范围内的默认名称空间名称。]”。 DefaultAttName 被定义为“xmlns”。 在我的情况下,如果它与没有命名空间相同,那么它是什么命名空间? XML 是否有一个预定义的默认命名空间,在我的情况下,没有用户提供的默认命名空间? 没有。没有 NS 意味着没有 NS。请查看 Ronald Bourret 的 Namespace Myths Exploded。 @Brian 而且它不是默认的 NS。这是一个默认的 NS 取消声明,因为正如 rec 所写:“在声明的范围内,这具有相同的效果,即没有默认命名空间。”【参考方案2】:

它不是一个有效的 XML NS。它不是有效的 XML NS 声明。请检查 XML 1.0 中命名空间的section 2.2:

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

但是,如果默认 NS 声明有效或无效,这是取消声明默认 NS 声明的唯一方法。请参阅 XML 1.0 和 1.1 中的命名空间,section 6.2。 1.1 NS rec 添加了一种方法来取消声明带有前缀的 NS 声明。

因此,它是 xmlns 特殊属性的有效值,但它不是 OP 所写的“有效的 XML 命名空间”。

【讨论】:

您似乎将命名空间前缀与实际命名空间(命名空间 URI)混淆了。空字符串不是有效的命名空间前缀,而是有效的命名空间 URI。 我认为我没有混淆任何东西。我知道区别。顺便说一句,我看不出我的回答可能暗示什么。 @lkuty 我认为您正在回答空字符串是否是有效的命名空间名称的问题。然而,OP 似乎询问空字符串是否是 xmlns 属性的有效值。也许这种脱节就是为什么会有两个相互矛盾的答案。 好的,这就解释了。在最初的问题中,OP 混淆了声明和 NS 名称,我专注于 NS 名称而不是声明。

以上是关于xmlns="" 是有效的 xml 命名空间吗?的主要内容,如果未能解决你的问题,请参考以下文章

“xmlns:xmpp”和“xmpp:xmlns”有啥区别?

(WPF)XAML 过程式代码

从输出元素中删除 xmlns=""

python读取xml问题

wpf 我已经把datagrid 分组了 如何 实现折叠 和 展开

在flex中xmlns="*"是啥意思