XML中的“xmlns”是啥意思?
Posted
技术标签:
【中文标题】XML中的“xmlns”是啥意思?【英文标题】:What does "xmlns" in XML mean?XML中的“xmlns”是什么意思? 【发布时间】:2010-11-13 23:47:17 【问题描述】:我在一个 XML 文件中看到以下行:
xmlns:android="http://schemas.android.com/apk/res/android"
我还在我遇到的许多其他 XML 文件中看到了xmlns
。
这是什么?
【问题讨论】:
看看:programmers.stackexchange.com/questions/122002/… 现在您也应该知道为什么当我们错误地使用标签或在错误的位置时我们会在 xml 中出现错误。 :) 【参考方案1】:意思是XML namespace。
基本上,XML 中的每个元素(或属性)都属于一个命名空间,这是一种“限定”元素名称的方式。
想象一下你和我都发明了我们自己的 XML。你发明 XML 来描述人,我发明我的来描述城市。我们俩都包含一个名为name
的元素。你的指的是人的名字,我的指的是城市名——好吧,有点做作。
<person>
<name>Rob</name>
<age>37</age>
<homecity>
<name>London</name>
<lat>123.000</lat>
<long>0.00</long>
</homecity>
</person>
如果我们将两个 XML 组合成一个文档,我们如何区分这两个名称?如上所示,name
元素有两个,但它们的含义不同。
答案是你和我都会为我们的 XML 分配一个命名空间,我们将使其独一无二:
<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
xmlns:cityxml="http://www.my.example.com/xml/cities">
<personxml:name>Rob</personxml:name>
<personxml:age>37</personxml:age>
<cityxml:homecity>
<cityxml:name>London</cityxml:name>
<cityxml:lat>123.000</cityxml:lat>
<cityxml:long>0.00</cityxml:long>
</cityxml:homecity>
</personxml:person>
现在我们已经完全限定了我们的 XML,对于每个 name
元素的含义没有歧义。所有以personxml:
开头的标签都是属于您的XML 的标签,所有以cityxml:
开头的标签都是我的。
有几点需要注意:
如果您排除任何命名空间声明,则将事物视为在默认命名空间中。
如果你声明一个没有标识符的命名空间,即xmlns="http://somenamespace"
,而不是xmlns:rob="somenamespace"
,它指定了文档的默认命名空间。
实际的命名空间本身,通常是IRI,并没有真正的意义。它应该是唯一的,因此人们倾向于选择自己拥有的 IRI/URI,但没有比这更重要的意义了。有时人们会将 XML 的架构(定义)放在指定的 IRI 中,但这只是某些人的惯例。
前缀也不重要。唯一重要的是前缀被定义为什么命名空间。几个以不同前缀开头的标签,所有映射到同一个命名空间的标签都被认为是相同的。
例如,如果前缀 personxml
和 mycityxml
都映射到同一个命名空间(如下面的 sn-p 所示),那么在给定元素前加上 personxml
或 @ 就没有关系987654338@,它们都会被 XML 解析器视为同一事物。关键是 XML 解析器不关心您选择什么作为前缀,只关心它映射的名称空间。前缀只是一个指向命名空间的间接。
<personxml:person
xmlns:personxml="http://example.com/same/url"
xmlns:mycityxml="http://example.com/same/url" />
属性可以被限定,但通常不是。他们也不从他们所在的元素继承他们的命名空间,而不是元素(见下文)。
此外,元素命名空间是从父元素继承的。换句话说,我同样可以将上述 XML 编写为
<person xmlns="http://www.your.example.com/xml/person">
<name>Rob</name>
<age>37</age>
<homecity xmlns="http://www.my.example.com/xml/cities">
<name>London</name>
<lat>123.000</lat>
<long>0.00</long>
</homecity>
</person>
【讨论】:
+1 好的、有用的概念性答案。您可能想要限定“基本上,xml 中的每个元素(或属性)都属于一个命名空间”,因为据说某些元素和属性位于“无命名空间”中。虽然我知道你是在提供基础知识。 @Rob Levine “属性可以命名空间,但通常不是。”安卓呢? 那么如何使用例如“your.example.com/xml/person”?好的,我有一个它定义了一个XML Namespace。
在您的示例中,命名空间前缀是“android”,命名空间 URI 是“http://schemas.android.com/apk/res/android"
在文档中,您会看到如下元素:<android:foo />
将命名空间前缀视为具有完整命名空间 URI 的短名称别名的变量。当 XML 解析器读取文档时,它相当于写 <http://schemas.android.com/apk/res/android:foo />
的“含义”。
注意:您实际上不能使用完整的命名空间 URI 代替 XML 实例文档中的命名空间前缀。
查看有关命名空间的本教程:http://www.sitepoint.com/xml-namespaces-explained/
【讨论】:
我总是将这些 URI 粘贴到 Web 浏览器中,只是为了查看解析器正在查看的内容,但它总是返回 404。它是否应该是一个需要附加标准文件名的真实 URI结束,还是只是一种制作唯一 id 的技术? @Patrick 是的,它只是一个需要唯一的 URI,以表明它是与其他名称空间分开的名称空间,因此任何潜在的重复标签都将被正确解释。所以 URI 通常不会指向任何内容。 嗯...很高兴知道它是一个命名空间。我曾经想知道指定 URI 是否会使 html 页面实际访问该网站以确定架构。 @Patrick,URI 与 URL 不同。 URL 是一个定位器,而 URI 只是一个标识符。您可以很好地选择 GUID 作为 URI。事实上,图书的 ISBN 是 URI 的一种形式。 那么标签是如何工作的?我的意思是<LinearLayout
没有前缀可以工作?【参考方案3】:
我认为最大的困惑是 xml 命名空间指向某种没有任何信息的 URL。但事实是,发明以下命名空间的人:
xmlns:android="http://schemas.android.com/apk/res/android"
也可以这样称呼:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
这只是一个唯一标识符。但是,已确定您应该将唯一的 URL 放在那里,并且可能指向该命名空间中使用的标签/属性的规范。这不是必需的。
为什么它应该是独一无二的?因为命名空间的目的是让它们唯一,所以你的命名空间中称为 background 的属性可以与另一个命名空间中的 background 区分开来。
由于这种独特性,您无需担心创建自定义属性时会发生名称冲突。
【讨论】:
嗨,莫菲顿。拜托,您能否在答案中添加指向参考的链接,指定内容或 URL 可以是任何内容?什么必须是独一无二的?还请澄清唯一性:XML 命名空间的名称或 URL 的内容?干杯 @olibre 如果你想使用 android 的命名空间,你应该使用他们的名字。那是他们独一无二的名字。他们决定在那里放一个 URL。如果您正在创建自己的命名空间,那么您可以随意调用它,只要确保它是唯一的即可。据说您应该使用指向您描述该命名空间内内容的位置的 URL,但正如您所见,即使是 android 命名空间的创建者也没有这样做。 谢谢莫菲顿。在阅读Rob's answer 时,我终于明白了这一点。我喜欢您的回答,因为它突出了一个鲜为人知的重要方面。但是请尝试改进您的答案,澄清哪些部分必须是唯一的,提供参考资料,改写,检查措辞......有些读者可能会对您当前的答案感到困惑。干杯 这就是我需要的答案!对这个属性值使用 URI 非常令人困惑,因为人们认为 URI=URL,并期望某些文档应该驻留在该位置。但是 AFAICT 如果 URI 返回 404 则完全没问题。它只是一个恰好看起来像地址的唯一标识符。可能有一些特殊的验证器希望在该位置找到模式或 DTD(这是有道理的),但我认为这些是特殊情况。如果我在这里错了,请纠正我。 @brennanyoung 和你说的完全一样 :)【参考方案4】:xmlns - xml 命名空间。这只是一种避免元素名称冲突的方法。例如:
<config xmlns:rnc="URI1" xmlns:bsc="URI2">
<rnc:node>
<rnc:rncId>5</rnc:rncId>
</rnc:node>
<bsc:node>
<bsc:cId>5</bsc:cId>
</bsc:node>
</config>
一个 xml 文件中有两个不同的 node
元素。如果没有命名空间,此文件将无效。
【讨论】:
【参考方案5】:您拥有名称空间,因此您可以拥有全球唯一的元素。然而,在 99% 的情况下,这并不重要,但是当你把它放在 The Semantic Web 的角度来看时,它就开始变得重要了。
例如,您可以通过使用适当的xmlns
来制作不同方案的 XML 混搭。比如用vCard混搭朋友的朋友等等。
【讨论】:
对于琐碎的 xml,我可能会忽略它,因为其他一切,命名空间都非常重要。 + 我真的没有看到语义网和命名空间之间的联系。语义网是一个概念,命名空间是 XML 标准的一部分,你在混合接口定义和实现细节。以上是关于XML中的“xmlns”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章