什么是XML命名空间?

时间:2008-09-24 17:03:38

标签: xml xsd namespaces schema xml-namespaces

我总是觉得有点难以向别人解释: 为什么存在XML命名空间? 我们什么时候应该使用它们,何时不应该使用它们 在XML中使用命名空间时常见的陷阱是什么?

此外,它们如何与XML模式相关? XSD架构是否应始终与命名空间相关联?

10 个答案:

答案 0 :(得分:33)

它们允许组合多种标记语言,而不必担心元素和属性名称的冲突。

例如,查看任何一点XSLT代码,然后想想如果你没有使用命名空间并且尝试编写一个输出必须包含“template”,“for-each”的XSLT会发生什么,等,元素。语法错误,是什么。

我会把建议和陷阱留给比我更有经验的人。

答案 1 :(得分:19)

为什么存在XML命名空间?

因为,早在1997年,W3C中一些非常有影响力的人想要他们,并且不会拒绝答案。即使有证据表明,我敢肯定地说,有更好的方法来解决他们认为存在的“问题”,他们仍然挥舞着他们的影响力,将他们的愿望写入W3C推荐书。

现在围绕XML命名空间的广泛神话中最大的一点就是它们具有技术优势。 (这是一份简单存在的建议书的下游效应,因而占据了思想空间 - “哎呀,必须有一个(好的)理由!” - 而不是某个地方的可忘记的脚注。)

Much pain, no gain

我们什么时候应该使用它们?什么时候不应该使用它们?

如果你能提供帮助,你绝不应该使用它们。不幸的是,感兴趣的各方不断推广这款BAD [*]设备已经促成了今天的一系列规范,这使得几乎不可能不必在某些时候与XML命名空间竞争。因此,即使您自己避开了XML命名空间,您也会发现来自各个方向的命名空间包含的crud,或者更糟糕的是,除非您向它们提供这样的问题,否则它们会拒绝工作。

在XML中使用命名空间时常见的缺陷是什么?

一个非常常见的缺陷是将Xpath表达式与名称空间被“默认”的文档一起使用:名称空间必须在表达式中显式化。另一个问题是在构建文档时“正确”使用它们:they create problems out of thin air

此外,它们如何与XML模式相关? XSD架构是否应始终与命名空间相关联?

没有必要的关系,除了XSD Schema规范是在委员会中几乎每个人都有XML命名空间的时候开发的。所以他们尽可能深入地工作。尽管如此,使用没有命名空间的XSD架构是可能的,但这是一个陡峭的艰难过程,因为几乎每个支持XSD架构的工具集都假设您“想要”使用命名空间。

[*] BAD =设计破碎

更新:An old essay on this non-solution to a non-problem

答案 2 :(得分:17)

这几乎与询问“为什么我们使用Java / C#包?”:

  • 可重用性:您可以重复使用在不同类型的xml文档中定义的一组标记/属性。
  • 模块化:如果您需要为XML添加一些“方面”;向xml文档添加命名空间比更改整个xml架构定义更简单。
  • 避免使用“主”命名空间:您不要强制解析器使用庞大的架构定义,只需使用您需要的命名空间。

答案 3 :(得分:12)

最大的陷阱IMHO是人工互动解释文件,例如开发代码来处理XML Doc。很容易关注文档的文字表达,而不是解析文档的信息集结果。

e.g。以下节点

<a xmlns="uri:foo"/>
<foo:a xmlns:foo="uri:foo"/>
<bar:a xmlns:bar="uri:foo"/>

在语义上都是相同的 - 但与天真的眼睛非常不同。

第一个例子产生了一个非常常见的错误,即开发XPath - 错过了“a”在命名空间中的事实 - 因此//产生的不匹配。 (或者更糟糕的是仍然匹配不同命名空间中的节点!)

第3个例子打开了另一个理解缺陷 - 前缀文本在语义上很重要。使用XPATH解析文档时,我可以声明任何我喜欢的匹配前缀,只要它与文档的那些匹配即可。

答案 4 :(得分:6)

将它们视为元素类型的姓氏。如果你有两个朋友,都叫Bob,而你正在谈论其中一个,有人可能会问你在谈论哪个Bob。只说“鲍勃”不是很有帮助,所以你说“鲍勃史密斯”或“鲍勃琼斯”。

元素类型也是如此。有时短名称是不够的,因为不同的人可以选择相同的名称。因此,您将URI作为“姓氏”,以区分不同的Bobs。

答案 5 :(得分:5)

XML是一种超级语言,这意味着它是任何基于XML的语言的基础(有道理,对吧?)。将XML视为可以用任何语言编写任何句子的笔。这一切都取决于作者,最好是读者应该知道语言。

XML 命名空间基本上是该语言的名称,非常类似于“英语”或“עברית”。我帮助XML文档的接收者解析它并在其中提取信息。

假设我有一家家具厂,你有一家家具店。您的存储应用程序和我的供应应用程序完全不相关,但是当它们通过XML消息进行通信时,消息应该是可以理解的并且可以被双方轻松解析

因此,两个系统都需要知道 Schema ,它定义了语言语法和约定的限制。将模式视为字典和语法教科书。模式是两个系统都应该知道的文档,每个系统中编写解析代码的人都必须知道,并且包括命名空间的声明。

每个命名空间都被命名为URI,在大多数情况下,它是定义它的模式文档的位置。

当然,并非每个XML文档都需要命名空间,尤其是当它不用于将信息传递给远程系统时。例如,将对象序列化为XML以便在数据库中保留时。

答案 6 :(得分:3)

我们使用命名空间,因为人们希望在他们自己的私人爱达荷中使用相同的词来表示不同的东西。通常,您可以根据上下文确定一个人的意思。在人员数据库中,XML是人员记录。在车辆登记数据库中,XML是车辆登记记录。

两者都保留一个名为“location”的标签,但标签对每个标签意味着不同的东西并包含不同的字段。

现在,这很酷:但如果您需要或想要在同一个数据库中存储XML,该怎么办?或者,更有趣的是,如果两个数据库都想从其他公共数据库(例如:帐户数据库)存储XML块,该怎么办。

XML命名空间将每个XML标记与URI相关联,这样标记名称本身前面就有一个URL,这是标记名称的一部分(当然,实际的XML文档使用简写来做这个)。通过仔细选择URI,很容易确信标签名称不会发生碰撞 - 就好像两个位置标签的名称完全不同,所以没有混淆。作为奖励,两个完全不同的位置标签可以包含来自帐户数据库的内容,并明确声明他们正在谈论相同的事情。

使这一切变得有用的是XPATH。

通过上述内容,您可以开始编写XPATH表达式,其中包含以下内容:在此xml中的任何位置找到任何accounts:account overdue个部分。或者:在这个特定的XML块中的任何地方找到任何accounts:warning message项,其中警告消息是personnel:payment节点或vehicle:status节点的子节点(无论多么深)。 / p>

XPATH表达式可能在XSLT文档中的某处使用,其作用是将XML转换为XHTML或XPDF,以便显示。

什么是回报?为什么这样?因为您可以搜索XML日志文件,所以将所有帐户过期消息从中删除,而不会将其与其他系统生成的“消息”标记混淆,将其转换为xhtml,并以粗体显示红色通过css标签:所有这些都没有编写一些程序代码

答案 7 :(得分:1)

例如:XML Namespaces by Example

用我的话来说:如果你必须为外部公司使用某种XML格式(例如),并且需要在XML文档中提供一些具有相同名称的信息,则需要一个命名空间。 例如:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="Blue"/>
      </items>
   </header>
</sampleDoc>

并且您希望将一些数据合并到此文档中,该文档具有相同的名称,但另一种意义(所以值为),您应该使用命名空间:

<sampleDoc>
   <header title="Hello world!">
      <items>
         <item name="Volvo" color="White" my_unique_namespace:color="#FFFFFF"/>
      </items>
   </header>
</sampleDoc>

当然 - 您可以更改属性的名称。例如“my_unique_color”。在另一个文件中,可以再次使用同名属性。因此,如果您有一个唯一的命名空间(例如我们的Web域),您可以随时使用相同的元素和/或属性名称。

答案 8 :(得分:0)

来自W3 recommendation ...

  

XML命名空间提供了一种简单的方法,用于通过将它们与URI引用标识的命名空间相关联来限定可扩展标记语言文档中使用的元素和属性名称。

答案 9 :(得分:0)

命名空间用于消除您在文档中使用的名称的歧义。它还使您能够将短名称绑定到名称空间,然后可以使用该名称空间来引用远程元素或属性。名称空间本身是指定义您在文档中使用的元素和属性的位置。还有很多要知道,但这是它的核心。还有更多信息here