XML 命名空间前缀:两个片段之间的区别

XML Namespace prefixes: difference between two snippets

有什么区别

<ns:MyRequest xmlns:ns="http://my.namespace">
        <node_a>2016-02-29T08:50:00</node_a>
        <node_b></node_b>
</MyRequest>

<MyRequest xmlns="http://my.namespace">
        <node_a xmlns="">2016-02-29T08:50:00</node_a>
        <node_b xmlns=""></node_b>
</MyRequest>

从 XML 信息模型的角度来看,它们是相同的:如果有 "expanded element name" 语法这样的东西,文档在这两种情况下看起来都是这样的:

<{http://my.namespace}MyRequest>
    <{}node_a>2016-02-29T08:50:00</{}node_a>
    <{}node_b></{}node_b>
</{http://my.namespace}MyRequest>

正如@potame 在评论中提到的(现在@forty-two 刚刚在另一个有助于显示扩展名 (+1) 的答案中重申),这两种形式是等价的.有无数种词法方式可以指定等效的命名空间 XML.

备注:

  • 它是关联的命名空间 URI,而不是最终重要的前缀。
  • 第二种形式使用默认命名空间,它将应用于 子节点 node_anode_b,如果不是 xmlns="",则 重置默认值并在没有命名空间的情况下留下 node_anode_b, 就像第一种形式一样。

虽然传统观点认为前缀的选择应该没有区别,但许多编程数据模型(包括 DOM 和 XPath)公开了前缀,这使得编写停止工作的应用程序变得非常容易如果有人选择不同的前缀。所以当我们说 "there is no difference" 时,我们的意思是 "a properly written application should treat them as equivalent"。不幸的是,尽管如此,大量处理 XML 数据的程序员并不了解 XML 的更微妙的功能,因此编写不当的应用程序相当普遍。