什么是XML名称空间?


72

我总是很难理解这一点:为什么存在XML名称空间?我们什么时候应该使用它们,什么时候不使用?在XML中使用命名空间时,常见的陷阱有哪些?

另外,它们与XML模式有何关系?XSD模式应该始终与名称空间关联吗?

Answers:


36

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

例如,看一下XSLT代码的任何部分,然后思考如果您不使用名称空间而试图编写XSLT,其中输出必须包含“模板”,“ for-each”等元素,将会发生什么情况? 。语法错误,是什么。

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


1
我感到惊讶的是,这种谬论在10到15年后仍然流行。另请参阅
arayq2

1
您是说名称空间是一个好的解决方案是错误的,还是说名称空间旨在用于去冲突并在实践中以这种方式使用(有任何缺点)是错误的?我只主张后者。
Steve Jessop 2013年

4
我说的是XML名称空间根本不是解决方案。该设备仅“解决”了一些用例,但绝不能解决所有用例,而且要以排除通用解决方案为代价-实际上存在,甚至在这种愚蠢见识之前就已经存在。而且,顺便说一句,最初它们是“用来”标记出处的,但是当有人指出这已经是一个已解决的问题时,支持者便开始四处移动球门柱,并一直坚持下去,直到批评家们发现与他们更好的联系。时间
arayq2 2013年

2
@ arayq2,...嗯?仅在所有人都同意的情况下使用“角色”属性才有用。看看我使用XML名称空间在生产中取得良好效果的地方(例如,将模板规则混入SVG模板中,并使用名称空间来描述Inkscape领域中的内容,属于模板引擎的内容等),我很难接受这样一个共识,即在没有相互了解的情况下设计的软件解决方案之间的这种互操作性水平,就不会像标准中所包含的那样存在。
查尔斯·达菲

1
实际上什么时候发生?(我怀疑几乎不会)此外,什么时候真正需要使用手写xml完成​​?如今,大多数xml是生成的,因此将以一种文档格式生成。XML名称空间是最精通的易货编程。
Beefster

23

为什么存在XML名称空间?

因为早在1997年,W3C中就有一些很有影响力的人想要他们,并且不会拒绝。即使敢于证明,即使有证明,有更好的方法来解决他们认为的“问题​​”,他们仍然会发挥自己的影响力,将自己的愿望写到W3C建议中。

到目前为止,围绕XML命名空间的广泛神话中最大的浪费是它们具有技术优势。(这是建议书仅存在的下游影响,因此占据了思维空间-“哎呀,一定有(好的)理由!”,而不是某个地方的遗忘脚注。)

很痛苦,没有收获

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

如果可以帮助,则永远不要使用它们。不幸的是,有兴趣的各方对BAD [*]设备的不懈推广,今天已经形成了规范的簇,这使得几乎不可能不必在某个时候与XML命名空间竞争。因此,即使您自己避开XML命名空间,也将发现从各个方向来看都存在命名空间中的杂乱无章的东西,或者更糟的是,除非您提供这些杂乱的工具集,否则这些工具集只会拒绝工作。

在XML中使用命名空间时,常见的陷阱有哪些?

一个非常常见的陷阱是将Xpath表达式与已将名称空间“默认”的文档一起使用:名称空间必须在表达式中是显式的。另一个问题是在构建文档时“正确”使用它们:它们凭空产生了问题

另外,它们与XML模式有何关系?XSD模式应该始终与名称空间关联吗?

没有必要的关系,只是XSD Schema规范是在委员会中几乎每个人都对XML命名空间有所了解的时候开发的。因此他们尽了最大努力。尽管如此,仍然可以使用不带名称空间的XSD架构,但这是一个艰难的尝试,因为几乎所有支持XSD架构的工具集都假设您将“想要”使用名称空间。

[*]不良=按设计要求破碎

更新:关于这个非问题非解决方案的旧文章


我全心全意地同意这种看法,即使不是很满意arayq2的热情水平。我想澄清一下我发现的陷阱:1)
算盘

1
1)命名空间很难摆脱。至少对于我一直使用的.Net工具而言,从xml对象中删除名称空间并非易事。“一旦您走上了黑暗的道路,它将永远统治您的命运。” 2)实现方式各不相同;XPath语法并不总是实现相同的(就像regex具有不同的风格。3)复杂性!如果您不认为任何不必要的复杂性是一个巨大的陷阱,请忽略我所说的一切。
算盘

5
@ arayq2您的答案的90%只是对您所遇到的一些个人问题进行了斧头磨擦,而无论哪种辩论导致将名称空间包括在内。我不喜欢名称空间,也不喜欢您抱怨的W3C的任何人,但是关于StackOverflow的答案并不适合您表达对此问题的个人见解。保留反对使用名称空间的实际论点,丢掉30种您只说“我认为名称空间很烂”的方式,以及指向将近20年之久的愤怒文章的链接。
John Colanduoni 2015年

17

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

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

1
嗨,弥敦道。不,这对我来说没有意义。可重用性在这里似乎并不适用...我也为命名空间的目的而战。在XHTML中,您会在那里找到一个名称空间,我想它的目的是将浏览器定向到您希望页面如何呈现。但在像SOAP,其中消息合同利用一个命名空间的...我没有看到其使用的用武之地
雅克·

12

恕我直言,最大的陷阱是人机交互解释文档,例如开发代码以处理XML Doc。专注于文档的文字表达而不是解析文档的信息集结果太容易了。

例如以下节点

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

在语义上都是相同的-但与幼稚的眼睛有很大不同。

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

第三个示例打开了另一个理解上的缺陷-前缀文本在语义上很重要。当使用XPATH解析文档时,只要uri与文档中的URI匹配,我就可以声明我想要匹配的任何前缀。


6

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

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


5

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

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

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

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

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

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


1
不需要名称空间有用的架构。
stephbu

好吧,如果没有执行验证,请确定。但是,名称空间的作用是什么?= 8
Yuval

3

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

两者都保留一个名为“ location”的标签,但是标签对每个标签都具有不同的含义,并且包含不同的字段。

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

XML名称空间与每个XML标记关联一个URI,以便标记名称本身在其前面有一个url,这是标记名称的一部分(当然,实际的XML文档使用速记方法来做到这一点)。通过仔细选择URI,很容易确定标记名称不会冲突-就像两个位置标记的命名完全不同一样,因此不会造成混淆。另外,两个完全不同的位置标签可以包含来自帐户数据库的内容,并明确声明它们在谈论同一件事。

使所有这些都有用的是XPATH。

通过上面的内容,您可以开始编写XPATH表达式,其内容如下:accounts:account overdue在此xml中的任意位置找到我的任何部分。或者:accounts:warning message在此XML特定块中的任意位置找到我的任何项目,其中警告消息是personnel:payment节点或vehicle:status节点的子节点(无论深度如何)。

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

收益是多少?为什么呢 因为您可以搜索XML日志文件,所以将所有过期的邮件都撤出,无论它们出现在什么地方,而不会与其他系统生成的“ message”标签混淆,将它们转换为xhtml,并通过css标签以红色粗体显示:all无需编写程序代码



我对这个答案的理解是,XML的名称空间本质上是一个用于分组或标识一组XML元素的标签?
KMC

1

例如:XML命名空间示例

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

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

并且您想要将一些数据合并到此文档中,该文件具有相同的名称,但是具有另一种含义(因此为value),则应使用名称空间:

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

当然-您可以更改属性的名称。例如为“ my_unique_color”。在另一个文档中芽,可以再次具有相同名称的属性。因此,如果您具有唯一的名称空间(例如我们的Web域),则可以始终使用相同名称的元素和/或属性,而不会遇到任何问题。


1
曾叱咤风云的!相当早以前,那篇文章正是xml-dev列表上长线程的跳板。该示例实际上可以显示其他内容。不幸的是,大多数人失去了关键点,直到今天仍然存在同样的盲点。
arayq2 2012年

0

W3建议...

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


3
不回答问题。问题是“什么是命名空间”,而不是“请给出定义”。
MarkJ

1
我认为实际提出您的观点会有所帮助。您可能已经可以使该人员获得一些了解W3建议的见识。
雅克

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.