首页 文章

在XML 1.1中解析名称空间和“Prefix Declared”命名空间约束

提问于
浏览
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 spec中的"Prefix Declared"名称空间约束 .

命名空间约束:前缀已声明除非是xml或xmlns,否则必须在使用前缀的元素的start-tag或祖先元素(即元素中的元素)中的名称空间声明属性中声明名称空间前缀 . 其内容以前缀标记出现) . 此外,最里面的这种声明中的属性值不能是空字符串 .

请注意最后一句“最内层此类声明中的属性值不能为空字符串”以及它如何应用于上述文档的 simple 元素中的 my: 未声明 . 当然这是 the innermost 这样的宣言?

我读到这个,是你不能取消声明前缀,除非你有一个子元素重新声明它 .

问题

  • 以上XML文档是否对Namespaces 1.1有效?

  • 如果是这样,我怎么误解了规范?答案是否可以举例说明 Session 并违反这一约束?

  • 如果没有,未申报的 Value 是多少?

1 回答

  • 1
    • 是的,根据Namespaces 1.1,它是有效的(技术上,“命名空间良好”)

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

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

相关问题