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

故事扮演 提交于 2020-02-27 12:43:02

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

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

我还遇到了许多其他XML文件中的xmlns

它是什么?


#1楼

它定义了XML命名空间

在您的示例中, 命名空间前缀为“ 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/


#2楼

这意味着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:开头的cityxml:都是我的。

有几点要注意:

  • 如果排除任何名称空间声明,则将事物视为默认名称空间。

  • 如果您声明一个没有标识符的名称空间,即xmlns="http://somenamespace" ,而不是xmlns:rob="somenamespace" ,它将为文档指定默认名称空间。

  • 实际的名称空间本身(通常是IRI )没有任何实际意义。 它应该是唯一的,因此人们倾向于选择自己拥有的IRI / URI,但没有比这更大的意义了。 有时人们会将XML的架构(定义)放在指定的IRI处,但这仅是某些人的约定。

  • 前缀也不重要。 唯一重要的是前缀定义为哪个命名空间。 多个以不同前缀开头的标签,它们都映射到相同的名称空间,被认为是相同的。

    例如,如果前缀personxmlmycityxml都映射到相同的名称空间(如下面的代码片段所示),则给定元素添加personxmlmycityxml ,它们都将被视为同一对象通过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>

#3楼

您具有名称空间,因此可以具有全局唯一的元素。 但是,在99%的时间中这并不重要,但是当您将其放在The Semantic Web的角度来看时,它开始变得很重要。

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


#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楼

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

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

也可以这样称呼它:

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

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

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!