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上,但这只是某些人的惯例.
前缀也无关紧要.唯一重要的是前缀定义为什么命名空间.以不同前缀开头的几个标签被认为是相同的,所有标签都映射到相同的名称空间.
例如,如果前缀personxml
和mycityxml
两者都映射到相同的命名空间(如下面的代码片段所示),那么如果使用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)
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/
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文件中的两个不同元素.如果没有名称空间,此文件将无效.
归档时间: |
|
查看次数: |
258626 次 |
最近记录: |