XML中的"xmlns"是什么意思?

use*_*637 400 xml xml-namespaces

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

xmlns:android="http://schemas.android.com/apk/res/android"
Run Code Online (Sandbox Code Playgroud)

xmlns在许多其他XML文件中也看到了我遇到过的问题.

它是什么?

Rob*_*ine 654

它意味着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>
Run Code Online (Sandbox Code Playgroud)

如果我们将两个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>
Run Code Online (Sandbox Code Playgroud)

现在我们已经完全限定了我们的XML,每个name元素的含义并不含糊.所有以标签开头的标签personxml:都是属于您的XML 的标签,所有标签都是我的标签cityxml:.

有几点需要注意:

  • 如果排除任何名称空间声明,则认为存在于默认名称空间中.

  • 如果声明没有标识符的命名空间,即xmlns="http://somenamespace",而不是xmlns:rob="somenamespace",它指定文档的默认命名空间.

  • 实际的命名空间本身(通常是IRI)并没有真正的后果.它应该是唯一的,因此人们倾向于选择他们拥有的IRI/URI,但它没有更大的意义.有时人们会将XML的架构(定义)放在指定的IRI上,但这只是某些人的惯例.

  • 前缀也无关紧要.唯一重要的是前缀定义为什么命名空间.以不同前缀开头的几个标签被认为是相同的,所有标签都映射到相同的名称空间.

    例如,如果前缀personxmlmycityxml两者都映射到相同的命名空间(如下面的代码片段所示),那么如果使用personxml或者为给定元素添加前缀并不重要,那么它们将mycityxml被XML解析器视为同一个事物.关键是XML解析器不关心你选择什么作为前缀,只关心它映射的命名空间.前缀只是指向命名空间的间接.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 属性可以是合格的,但通常不是.它们也不会从它们所在的元素继承它们的命名空间,而不是元素(见下文).

此外,元素名称空间继承自父元素.换句话说,我同样可以将上面的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>
Run Code Online (Sandbox Code Playgroud)

  • +1好,有用的概念性答案.您可能希望限定"基本上,xml中的每个元素(或属性)都属于命名空间",因为一些元素和属性被称为"无命名空间".虽然我明白你给的是基础知识. (11认同)
  • 这个微软文档链接:"https://msdn.microsoft.com/en-us/library/aa468565.aspx"非常好地解释了XML中的命名空间. (2认同)

Mad*_*sen 289

它定义了XML命名空间.

在您的示例中,命名空间前缀是" android ",名称空间URI是" http://schemas.android.com/apk/res/android "

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

将名称空间前缀视为具有完整名称空间URI的短名称别名的变量.<http://schemas.android.com/apk/res/android:foo />当XML解析器读取文档时,它相当于写出它的"含义".

注意:您无法在XML实例文档中实际使用完整命名空间URI代替命名空间前缀.

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

  • 我总是将这些URI粘贴到Web浏览器中,只是为了查看解析器正在查看的内容,但它总是返回404.它应该是一个真正的URI,需要在最后添加标准文件名,或者它只是一种技术制作一个独特的身份证? (59认同)
  • @Patrick是的,它只是一个需要唯一的URI,以表明它是一个独立的命名空间,因此任何潜在的重复标记都将被正确解释.所以URI经常指向什么. (35认同)
  • @Patrick,URI与URL不同.URL是定位器,URI只是标识符.您可以选择GUID作为URI.事实上,我们为书籍提供的ISBN是一种URI形式. (16认同)
  • 解析器如何使用此信息? (6认同)
  • 嗯...很高兴知道这是一个名称空间。我曾经想知道是否指定URI会使html页面实际上访问该网站来确定模式。 (3认同)

Mor*_*don 13

我认为最大的困惑是xml命名空间指向某种没有任何信息的URL.但事实是发明在命名空间下方的人:

xmlns:android="http://schemas.android.com/apk/res/android"
Run Code Online (Sandbox Code Playgroud)

也可以这样称呼它:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
Run Code Online (Sandbox Code Playgroud)

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

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

由于这种独特性,您无需担心如果您创建自定义属性,您将发生名称冲突.


小智 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>
Run Code Online (Sandbox Code Playgroud)

node一个xml文件中的两个不同元素.如果没有名称空间,此文件将无效.