XML名称空间的用途是什么?

XML名称空间的用途是什么?,xml,xsd,namespaces,schema,xml-namespaces,Xml,Xsd,Namespaces,Schema,Xml Namespaces,这是我总是觉得有点难以向他人解释的事情: XML名称空间为什么存在? 我们什么时候应该使用它们,什么时候不应该? 在XML中使用名称空间时,常见的陷阱是什么 另外,它们与XML模式的关系如何?XSD模式是否应该始终与命名空间关联?来自 XML名称空间提供了一种简单的方法,通过将可扩展标记语言文档中使用的元素和属性名称与URI引用标识的名称空间相关联来限定它们 它们允许组合多种标记语言,而不必担心元素和属性名称的冲突 例如,查看任何XSLT代码,然后思考如果不使用名称空间并试图编写一个输出必须包含

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

另外,它们与XML模式的关系如何?XSD模式是否应该始终与命名空间关联?

来自

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


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

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


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

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

这几乎等同于问“为什么我们要使用Java/C的软件包?”

  • 可重用性:可以在不同类型的xml文档中重用定义的一组标记/属性
  • 模块化:如果需要在XML中添加一些“方面”;向xml文档添加名称空间比更改整个xml模式定义更简单
  • 避免争论“main”名称空间:您不必强迫解析器处理庞大的模式定义,只需使用需要的名称空间即可
    • 例如:

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

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

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

      当然,您可以更改属性的名称。例如“我的独特颜色”。在另一个文档中,可以有同名的属性。因此,如果您有一个唯一的名称空间(例如我们的web域),您可以始终使用相同的元素和/或属性名称,而不会出现任何问题。

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


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

      XML是一种超级语言,这意味着它是任何基于XML的语言的基础(有意义,对吧?)。把XML想象成一支可以用任何语言书写任何句子的笔。这一切都取决于作者,最好是读者了解语言

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

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

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

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


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

      IMHO最大的陷阱是人机交互解释文档,例如开发处理XML文档的代码。关注文档的文本表达式而不是解析文档的信息集结果太容易了

      e、 g.以下节点

      <a xmlns="uri:foo"/>
      <foo:a xmlns:foo="uri:foo"/>
      <bar:a xmlns:bar="uri:foo"/>
      
      
      
      在语义上都是相同的,但与天真的眼睛大不相同

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


      第三个例子在理解上打开了另一个缺陷——前缀文本在语义上是重要的。当使用XPATH解析文档时,只要uri与文档的uri匹配,我就可以声明我喜欢的任何前缀进行匹配。

      我们使用名称空间,因为人们希望在自己的爱达荷州私人住宅中使用相同的词来表示不同的内容。通常,你可以根据上下文判断一个人的意思。在人事数据库中,XML是人事记录。在车辆注册数据库中,XML是车辆注册记录

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

      现在,这很酷:但是如果你
      <a xmlns="uri:foo"/>
      <foo:a xmlns:foo="uri:foo"/>
      <bar:a xmlns:bar="uri:foo"/>