1

例子

显然,这是一个有效的 XML 文档(从http://www.lenzconsulting.com/namespaces/复制)。

<?xml version="1.1"?>
<my:doc xmlns:my="http://xmlportfolio.com/xmlguild-examples">
<simple xmlns:my="">
  <remark>We don't use namespaces.</remark>
</simple>
</my:doc>

然而,它似乎违反了Namespace 1.1 规范中的“Prefix Declared”命名空间约束。

命名空间约束:前缀声明

命名空间前缀,除非它是 xml 或 xmlns,必须在命名空间声明属性中声明在使用前缀的元素的开始标记或祖先元素(即,其内容中出现前缀标记的元素)。此外,最里面的此类声明中的属性值不得为空字符串。

请注意最后一句“最里面的此类声明中的属性值不得为空字符串”以及它如何应用于上述文档元素中的my:未声明。simple这肯定是最里面的这样的声明吗?

我对此的解读是,您不能取消声明前缀,除非您有一个重新声明它的子元素。

问题

  1. 上述 XML 文档对于 Namespaces 1.1 是否有效?
  2. 如果是这样,我是如何误解规范的?答案能否给出满足和违反此约束的示例和反例?
  3. 如果不是,取消声明的价值是什么?
4

1 回答 1

3
  1. 是的,根据命名空间 1.1,它是有效的(技术上,“命名空间格式正确”)

  2. 您引用的规则是指元素和属性名称的有效性,例如 my:element 或 my:attribute,它是关于此类名称中前缀“my”的有效性的规则。您没有任何前缀为“my”的元素或属性,其中命名空间声明 xmlns:my 是最里面的声明,因此您没有违反规则。

  3. 未申报的价值很小。这是一个很大的错误:为解决一个小问题而对规范进行了痛苦的补充。小问题是“命名空间污染”:例如,如果您将一些 XML 有效负载包装在 SOAP 信封中,那么 SOAP 命名空间会渗透到您的有效负载中,当您提取有效负载时,很难摆脱 SOAP 命名空间。命名空间声明旨在解决该问题。但它几乎从未使用过,因为在实践中,每个人都会忽略不必要的未使用命名空间。

于 2014-08-07T07:47:33.497 回答