什么是XML名称空间?

这是我总是发现有点难以向其他人解释的:为什么XML名称空间存在? 我们什么时候应该使用它们? 在XML中使用名称空间时常见的缺陷是什么?

另外,它们如何与XML模式相关? XSD模式应该总是与一个命名空间相关联?

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

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

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

这跟问“为什么我们使用Java / C#包?”几乎是一样的:

  • 可重用性 :您可以重复使用您在不同types的xml文档中定义的一组标签/属性。
  • 模块化 :如果你需要添加一些“方面”到您的XML; 添加一个命名空间到你的XML文档比改变你的整个XML模式定义更简单。
  • 避免污染“主”命名空间 :你不要强制你的parsing器使用巨大的模式定义,只需要使用你需要的命名空间。

IMHO最大的缺陷是人机交互解释文件,例如开发代码来处理XML Doc。 专注于文档的文字expression而非parsing文档的信息结果太容易了。

例如以下节点

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

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

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

第三个例子打开另一个理解缺陷 – 前缀文本在语义上是重要的。 使用XPATHparsing文档时,只要匹配文档的URI,我就可以声明任何我喜欢的匹配前缀。

为什么XML名称空间存在?

因为早在1997年,W3C的一些非常有影响力的人就想要他们,而不会采取任何回答。 即使有人certificate,我敢说,有更好的办法来解决他们认为的“问题​​”,他们仍然发挥了他们的影响力,把他们的愿望写入W3C的build议书。

现在围绕XML命名空间的广泛神话中最大的威胁是对他们有技术上的好处。 (这是一个简单存在的build议书的下游效应,因此占据了思想空间 – “哎呀,这里应该有一个(好的)理由!” – 而不是一个可伪造的脚注)。

很痛苦,没有收获 。

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

如果你能帮上忙,你永远不要使用它们。 不幸的是,感兴趣的各方对这个BAD [*]设备的无情推广已经促成了今天的规格集群,使得实际上不可能不必在某个点或另一个地方与XML命名空间相抗衡。 所以,即使你自己避开了XML命名空间,你也会发现从各个方向来的命名空间的crud,或者更糟糕的是,工具集只是拒绝工作,除非你给它们提供这样的crud。

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

一个非常常见的错误是在文档中使用Xpathexpression式,其中名称空间已经被“默认”:命名空间必须在expression式中是显式的。 另一个问题是在构build文档时“正确”使用它们: 它们凭空创造问题 。

另外,它们如何与XML模式相关? XSD模式应该总是与一个命名空间相关联?

没有必要的关系,除了XSD架构规范是在委员会中的每个人都有XML命名空间的时候开发的。 所以他们尽可能深入地工作。 尽pipe如此,使用XSD模式却没有命名空间是可能的,但是对于所有支持XSD模式的工具集来说,这都是一个艰难的过程,假定您将“想要”使用命名空间。

坏了=坏了devise

更新: 关于这个非解决问题的一个老问题 。

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

这与元素types是一样的。 有时短名是不够的,因为不同的人可以select相同的名字。 所以你包含一个URI作为“姓氏”,以区分不同的鲍勃在那里。

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

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

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

因此,两个系统都需要知道SchemaSchema定义了语言语法和约定的限制。 把架构看作字典和语法教科书。 模式是两个系统都应该知道的文档,每个系统中编写parsing代码的人都必须知道,并且包括名称空间的声明。

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

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

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

两者都保留一个名为“位置”的标签,但标签意味着不同的东西,并包含不同的领域。

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

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

使所有这些有用的东西是XPATH。

通过上面的介绍,你可以开始编写XPATHexpression式,这些expression式的内容如下:find我的任何accounts:account overdue在这个XML的任何地方accounts:account overdue部分。 或者:find我的任何accounts:warning message在这个特定的XML块中的任何地方accounts:warning message项目,其中警告消息是personnel:payment节点或vehicle:status节点的子节点(无论深度)。

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

什么是回报? 为什么呢? 因为您可以searchXML日志文件,所有账户逾期消息,无论他们出现, 而不会混淆他们与其他系统产生的“消息”标签 ,将其转换为XHTML,并通过CSS标签显示为粗体红色: 所有不用写一些程序代码

从W3的build议 …

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

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

例如: 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域名),你总是可以使用相同的元素名称和/或属性来排除任何问题。