XML中的“ xmlns”是什么意思?


415

我在XML文件中看到以下行:

xmlns:android="http://schemas.android.com/apk/res/android"

我也看过 xmlns遇到了许多其他XML文件。

它是什么?




现在,您还应该知道为什么当我们错误地或在错误的位置使用标记时,为什么在xml中出现错误。:)
Vaibs '17

Answers:


299

它定义了XML命名空间

在您的示例中,命名空间前缀为“ android ”,命名空间URI为“ http://schemas.android.com/apk/res/android

在文档中,您将看到以下元素: <android:foo />

将名称空间前缀视为具有完整名称空间URI的简称别名的变量。<http://schemas.android.com/apk/res/android:foo />就XML解析器读取文档时的“含义”而言,这相当于写作。

注意:您实际上不能使用完整的名称空间URI代替XML实例文档中的名称空间前缀。

查看有关名称空间的本教程:http : //www.sitepoint.com/xml-namespaces-explained/


62
我总是将这些URI粘贴到Web浏览器中只是为了查看解析器在看什么,但是它总是返回404。它应该是一个真正的URI,需要在其末尾添加标准文件名吗?制作唯一的ID?
Patrick

36
@Patrick是的,它只是一个需要唯一的URI,以表明它是与其他资源不同的名称空间,因此任何潜在的重复标签都将得到正确的解释。因此,URI通常不会指向任何内容。
foochow

3
嗯...很高兴知道这是一个名称空间。我曾经想知道指定URI是否会使html页面实际上访问该网站以确定模式。
2014年

17
@ Patrick,URI与URL不同。URL是定位符,而URI只是标识符。您很可能选择GUID作为URI。实际上,我们用于书籍的ISBN是URI的一种形式。
Jaywalker 2014年

那么标签如何工作?我的意思<LinearLayout是没有前缀的作品?
Asif Mushtaq

676

这意味着XML名称空间

基本上,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都映射到相同的名称空间(如下面的代码片段所示),则给定元素添加前缀personxml或都没有关系mycityxml,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>

13
+1好的,有用的概念性答案。您可能需要限定为“基本上,xml中的每个元素(或属性)都属于一个名称空间”,因为据说某些元素和属性位于“无名称空间”中。虽然我了解您在提供基本知识。
LarsH 2011年

1
@Rob Levine“属性可以命名,但通常不能命名。” 那么Android呢?
Paul Brewczynski 2013年

1
那么如何使用“ your.example.com/xml/person ”呢?好的,我有一个<person:name>标签,现在呢?你也可以解释一下吗?
Koray Tugay 2014年

1
@WORMSS-是的-你是对的。定义查询时,您可能需要通过前缀来指定名称空间。例如,在C#System.Xml世界中,您将使用XmlNamespaceManager.AddNamespace在名称空间管理器中注册一个前缀,然后在查询中使用该前缀。前缀没有出现在文档中的事实无关紧要-只是它也映射了什么名称空间。
罗布·莱文

2
此Microsoft文档链接:“ msdn.microsoft.com/en-us/library/aa468565.aspx ”很好地解释了XML中的名称空间。
Deen John

16

我认为最大的困惑是xml名称空间指向的是没有任何信息的URL。但事实是,发明了以下名称空间的人:

xmlns:android="http://schemas.android.com/apk/res/android"

也可以这样称呼它:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

这只是一个唯一标识符。但是,已确定您应该在其中放置唯一的URL,并且可以潜在地指向该命名空间中使用的标记/属性的规范。不需要。

为什么它应该是独特的?因为命名空间的目的是让他们独特因此,例如所谓的属性背景从您的命名空间可以从被区分背景从另一个命名空间。

由于具有这种唯一性,因此您不必担心,如果创建自定义属性,则会发生名称冲突。


嗨,莫菲顿。请,您可以在答案中添加指向引用的链接,以指定内容或URL可以是任何内容吗?什么必须是唯一的?还请说明唯一性:XML名称空间的名称或URL的内容?干杯
olibre

@olibre如果要使用android的命名空间,则应使用其名称。那是他们的唯一名字。他们决定在此处放置一个URL。如果要创建自己的名称空间,则可以随意命名,只要确保它是唯一的即可。据说您应该使用指向您描述该命名空间内部内容的地方的URL,但是您可以看到,即使是android名称空间的创建者也没有这样做。
Morfidon '17

谢谢Morfidon。在阅读Rob的答案时,我终于明白了这一点。我喜欢您的回答,因为它突出了一个鲜为人知的重要方面。但是,请尝试改善您的答案,阐明哪些部分必须是唯一的,提供参考,重新措词,检查措辞...您的当前答案可能会使某些读者感到困惑。干杯
olibre

1
这是我需要的答案!将URI用作此属性值会造成混淆,因为人们认为URI = URL,并期望某些文档应位于该位置。但是AFAICT完全可以,如果URI返回404。它只是一个看起来像地址的唯一标识符。可能会有一些特殊的验证器希望在该位置找到一个模式或DTD(这很有意义),但是我认为这是特殊情况。如果我错了,请纠正我。
brennanyoung '19

1
@brennanyoung,就像您所说的一样:)
Morfidon

12

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>

node一个xml文件中的两个不同元素。没有名称空间,该文件将无效。


4

您具有名称空间,因此可以具有全局唯一的元素。但是,在99%的时间中这并不重要,但是当您从语义网的角度来看时,它就变得很重要。

例如,您可以只使用适当的XML进行不同方案的XML混搭xmlns。例如,使用vCard混搭一个朋友的朋友。


对于琐碎的xml,我可能会忽略它,因为其他所有名称空间都非常重要。+我真的看不到语义网和名称空间之间的联系。语义网是一个概念,名称空间是XML标准的一部分,您正在混合接口定义和实现细节。
Newtopian
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.