我在XML文件中看到如下行: node
xmlns:android="http://schemas.android.com/apk/res/android"
我還遇到了許多其餘XML文件中的xmlns
。 android
它是什麼? 架構
它定義了XML命名空間 。 url
在您的示例中, 命名空間前綴爲「 android 」, 命名空間URI爲「 http://schemas.android.com/apk/res/android 」 spa
在文檔中,您會看到相似如下內容的元素: <android:foo />
code
將名稱空間前綴視爲具備完整名稱空間URI的簡稱別名的變量。 關於XML解析器讀取文檔時的「含義」,這至關於編寫<http://schemas.android.com/apk/res/android:foo />
。 xml
注意: 您實際上不能使用完整的名稱空間URI代替XML實例文檔中的名稱空間前綴。 對象
查看有關名稱空間的本教程: http : //www.sitepoint.com/xml-namespaces-explained/ 繼承
這意味着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處,但這僅是某些人的約定。
前綴也不重要。 惟一重要的是前綴定義爲哪一個命名空間。 多個以不一樣前綴開頭的標籤,它們都映射到相同的名稱空間,被認爲是相同的。
例如,若是前綴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>
您具備名稱空間,所以能夠具備全局惟一的元素。 可是,在99%的時間中這並不重要,可是當您將其放在The Semantic Web的角度來看時,它開始變得很重要。
例如,您能夠僅使用適當的xmlns
進行不一樣方案的XML混搭。 例如,使用vCard混搭一個朋友的朋友。
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
元素。 沒有名稱空間,該文件將無效。
我認爲最大的困惑是xml名稱空間指向的是沒有任何信息的URL。 但事實是,發明瞭如下名稱空間的人:
xmlns:android="http://schemas.android.com/apk/res/android"
也能夠這樣稱呼它:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
這只是一個惟一標識符。 可是,已肯定您應該在其中放置惟一的URL,而且能夠潛在地指向該命名空間中使用的標記/屬性的規範。 不須要。
爲何它應該是獨特的? 由於命名空間的目的是讓他們獨特所以,例如所謂的從您的命名空間的背景屬性能夠從另外一個命名空間的背景區分開來。
因爲具備這種惟一性,所以您沒必要擔憂,若是建立自定義屬性,則會發生名稱衝突。