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

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

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

在我遇到的许多其他XML文件中,我也看到了xmlns

这是什么

它意味着XML名称空间

基本上,XML中的每个元素(或属性)都属于一个名称空间,这是“限定”元素名称的一种方式

想象一下,你和我都发明了我们自己的XML。你发明XML来描述人,我发明XML来描述城市。我们两个都包含一个名为name的元素。你指的是人的名字,我指的是城市的名字好吧,这有点做作

<人>
<名称>罗布&lt/名称>
<年龄>37&lt/年龄>
<家乡>
<名称>伦敦&lt/名称>
<lat>123.000&lt/lat>
<长期>0.00&lt/长期>
&lt/家乡>
&lt/人>

如果我们将两个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>罗布&lt/personxml:name>
<personxml:age>37&lt/personxml:age>
<cityxml:家乡城市>
<cityxml:name>伦敦&lt/cityxml:name>
<城市XML:lat>123.000&lt/城市XML:lat>
<cityxml:long>0.00&lt/cityxml:long>
&lt/cityxml:家乡城市>
&lt/personxml:person>

现在我们已经完全限定了XML,对于每个name元素的含义没有任何歧义。所有以personxml:开头的标记都属于您的XML,所有以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编写为

<人xmlns=”http://www.your.example.com/xml/person“>
<名称>罗布&lt/名称>
<年龄>37&lt/年龄>
<homecity xmlns=”http://www.my.example.com/xml/cities“>
<名称>伦敦&lt/名称>
<lat>123.000&lt/lat>
<长期>0.00&lt/长期>
&lt/家乡>
&lt/人>

发表评论