为什么我需要在XML元素前加上x:?

时间:2011-05-19 10:19:38

标签: xml xml-serialization

我看到了各种情况,其中XML文件中的元素以x:或其他内容为前缀。

这是为了什么目的?

另外,xml的“命名空间”是什么意思? (通常是一些URL)?它是如何以任何方式使用的?

2 个答案:

答案 0 :(得分:6)

“x:”是名为x的命名空间别名。在该元素之上的某个地方会有一个xmlns:x属性指向某个url,url通常不重要,它只是命名空间的标识符。

“x”只是文件的本地名称,它也可以是xmlns:foo,只要foo:在任何地方都使用x:被使用。

xml处理器通常使用命名空间来确保它们正在寻找正确的元素(例如,对于xlst转换),而不是用户在xml中定义的自定义元素。

您可以阅读有关xml命名空间here

的更多信息

答案 1 :(得分:3)

x:是XML中的命名空间标识符。 XML子树可以为元素和属性(由xmlns='...'设置)具有一个»default«命名空间。如果您需要来自其他命名空间的元素或属性,则需要定义前缀,例如xmlns:x='...'。然后,您在该命名空间中使用的元素和属性需要以x:为前缀。我常见的是

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"

然后要求我use元素执行以下操作:

<use xlink:href='#foo'/>

在这种情况下,use元素来自SVG,而href元素来自XLink。两者都不同,但在某些地方兼容规格。

这基本上就是命名空间的用途:

  • 将不同的XML用法分组为连贯的部分
  • 允许它们在单个XML中使用
  • 潜在地避免名称冲突(如果您有两个名称空间并且都允许名为foo的元素,那么您需要指定您想要的两个foo中的

这样,名称空间与它们在许多编程语言中的工作方式没有太大区别。您可以通过名称空间查看您导入的内容,就像上面SVG案例中的库一样。编写SVG的人注意到已经有一个允许链接到任意XML元素(XLink)的规范,他们只是重复使用它。在其他情况下,例如WPF,存在名称空间以分隔表示框架的声明UI内容和与代码交互所需的粘合属性。例如。一个窗口可能看起来像这样:

<Window
    x:Class="W"
    Height='500'
    Width='500'
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

只有编译器知道适当的代码隐藏类才需要Class属性,它在窗口上没有任何明显的差异。

另一个例子是XSLT,您可以在其中定义XML文档的转换。 XSLT指令和输出模板都是XML。您通常为XSLT的元素使用显式命名空间:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

这样你就可以像这样发出生成的XML:

<xsl:if test="Content/Chapter">
  <xsl:variable name="text"><xsl:value-of select="$trans//item[@name='content'][lang($lang)]" /></xsl:variable>
  <h2><xsl:value-of select="$text"/></h2>
    <ol>
      <xsl:apply-templates select="Content" mode="TableOfContents"/>
    </ol>
</xsl:if>

如果我要将xsl:命名空间设为默认命名空间,那么XSLT处理器无法告诉我从实际指令生成HTML。如果您的代码和数据使用相同的格式并且位于同一个地方,则会出现问题。我相信Lisp通过使用单引号标记数据来解决这个问题。

对于作为URI的名称空间,这可能只是一个W3C的事情。这些URI不需要任何东西。它们只是标识符。它们并不意味着要被检索。使用带命名空间的XML的程序必须知道它可以处理的命名空间并采取适当的行动。