这是我总是觉得有点难以解释给其他人:为什么XML名字空间的存在吗?当我们应该使用他们的时候我们是不是应该?什么是共同的缺陷时,工作用的名字空间在XML?

还有,它们如何不涉及到XML模式?应该文件的模式始终与一个名字空间?

有帮助吗?

解决方案

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

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

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

其他提示

为什么存在XML命名空间?

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

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

痛苦多了,没有收获

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

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

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

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

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

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

[*] BAD =设计破碎

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

它几乎相同问"为什么我们使用的软件包为Java/C#?":

  • 重复使用性:你可以重复使用的一套标签/属性的定义在不同类型的xml文件。
  • 模块化:如果你需要添加一些"方面"你XML;增添一个名字空间,以xml文件是简单的比改变你的整个xml模式的定义。
  • 避免poluting"主要的"名字空间:你不要强迫你的分析工作的一个巨大的架构定义,只是利用空间的需要。

最大的陷阱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解析文档时,我可以声明任何我喜欢的匹配前缀,只要它与文档的那些匹配即可。

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

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

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

XML 命名空间基本上是该语言的名称,非常类似于“英语”。或“&#1506;&#1489;&#1512;&#1497;&#1514;&quot;。我帮助XML文档的接收者解析它并在其中提取信息。

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

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

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

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

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

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

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

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

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

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

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

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

例如:按示例列出的XML命名空间

用我的话来说:如果你必须为外部公司使用某种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域),您可以随时使用相同的元素和/或属性名称。

来自 W3推荐 ......

  

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top