XMLファイルに次の行が表示されました。
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns
私が出くわした他の多くのXMLファイルでも見ました。
それは何ですか?
XMLファイルに次の行が表示されました。
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns
私が出くわした他の多くのXMLファイルでも見ました。
それは何ですか?
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>
2つのXMLが1つのドキュメントに結合された場合、2つの名前をどのように区別しますか?上記のように、2つの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:
は私のものです。
注意すべき点がいくつかあります。
名前空間宣言を除外すると、デフォルトの名前空間にあると見なされます。
識別子なしで、つまり、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>
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/
最大の混乱は、xml名前空間が情報を持たないある種のURLを指していることだと思います。しかし、真実は、名前空間の下で発明した人が:
xmlns:android="http://schemas.android.com/apk/res/android"
次のように呼ぶこともできます:
xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"
これは単なる一意の識別子です。ただし、一意であり、その名前空間で使用されるタグ/属性の仕様を指す可能性のあるURLをそこに配置する必要があることが確立されています。必須ではありません。
なぜそれはユニークでなければならないのですか?名前空間の目的はそれらを一意にすることであるため、たとえば名前空間のbackgroundと呼ばれる属性を、別の名前空間の背景と区別することができます。
その一意性のために、カスタム属性を作成する場合に名前が衝突することを心配する必要はありません。
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>
node
1つのxmlファイル内の2つの異なる要素。名前空間がないと、このファイルは無効になります。
名前空間があるので、グローバルに一意の要素を持つことができます。ただし、99%の場合、これは実際には問題ではありませんが、セマンティックWebの観点から見ると、重要になり始めています。
たとえば、適切なを使用するだけで、さまざまなスキームのXMLマッシュアップを作成できますxmlns
。たとえば、友達の友達をvCardなどでマッシュアップします。