XMLの「xmlns」とはどういう意味ですか?


415

XMLファイルに次の行が表示されました。

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

私がxmlns遭遇した他の多くのXMLファイルでも見ました。

それは何ですか?




これで、タグを誤って、または間違った場所で使用すると、なぜxmlでエラーが発生するのかを理解する必要があります。:)
Vaibs 2017

回答:


299

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/


62
パーサーが見ているものを確認するために、常にこれらのURIをWebブラウザーに貼り付けますが、常に404を返します。これは、末尾に標準のファイル名を付加する必要がある実際のURIであると考えられますか、それとも単なるテクニックですか?一意のIDを作成するため
Patrick

36
@Patrickはい、それは他のものとは別の名前空間であることを示すために一意である必要がある単なるURIであり、潜在的な重複タグは正しく解釈されます。したがって、URIは多くの場合、何も指し示しません。
foochow 2014年

3
うーん...名前空間だと知ってよかった。URIを指定すると、HTMLページが実際にそのWebサイトにアクセスしてスキーマを決定するのかどうか疑問に思っていました。
2014年

17
@ Patrick、URIはURLと同じではありません。URLはロケーターであり、URIは単なる識別子です。URIとしてGUIDを選択することもできます。実際、私たちが本のために持っているISBNはURIの形式です。
Jaywalker、2014

次に、タグはどのように機能しますか?私は<LinearLayout接頭辞なしで作品を意味しますか?
Asif Mushtaq 2017年

676

これは、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に配置する場合もありますが、これは一部の人々だけの規則です。

  • プレフィックスも重要ではありません。重要なのは、接頭辞がどの名前空間として定義されているかだけです。異なる接頭辞で始まるいくつかのタグは、すべて同じ名前空間にマップされ、同じと見なされます。

    たとえば、プレフィックスpersonxmlmycityxml両方が同じネームスペースにマッピングされている場合(以下のスニペットのように)、特定の要素にプレフィックスとしてpersonxmlor を付けても問題ありません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>

13
+1の、役に立つ概念的な答え。一部の要素と属性は「名前空間なし」にあると言われているため、「基本的に、xml内のすべての要素(または属性)は名前空間に属している」と修飾することができます。あなたが基本を与えていたと私は理解していますが。
LarsH 2011

1
@Rob Levine「属性には名前空間を付けることができますが、一般的にはそうではありません。」Androidはどうですか?
Paul Brewczynski、2013

1
では、たとえば「your.example.com/xml/person」はどのように使用されるのでしょうか。さて、<person:name>タグがあります。これについても説明していただけますか?
Koray Tugay 2014

1
@WORMSS-はい-あなたは正しいです。クエリを定義するときは、おそらくプレフィックスを介して名前空間を指定する必要があります。たとえば、C#System.Xmlの世界では、XmlNamespaceManager.AddNamespaceを使用して名前空間マネージャーにプレフィックスを登録し、このプレフィックスをクエリで使用します。接頭辞がドキュメントに表示されないという事実は重要ではありません-それがマッピングする名前空間だけです。
Rob Levine 2015年

2
このマイクロソフトドキュメントリンク: " msdn.microsoft.com/en-us/library/aa468565.aspx "は、XMLの名前空間を非常によく説明しています。
Deen John

16

最大の混乱は、xml名前空間が、情報を持たないある種のURLを指していることだと思います。しかし真実は名前空間の下で発明した人です:

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

それをそのように呼び出すこともできます:

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

これは単なる一意の識別子です。ただし、一意であり、その名前空間で使用されているタグ/属性の仕様を指す可能性があるURLを配置する必要があることが確立されています。これは必須ではありません。

なぜそれがユニークでなければならないのですか?名前空間の目的はそれらを一意にすることなので、たとえば名前空間からbackgroundと呼ばれる属性を別の名前空間からの背景と区別することができます。

その一意性のため、カスタム属性を作成する場合に名前の衝突が発生することを心配する必要はありません。


こんにちはモルフィドン。回答に、コンテンツまたはURLを指定できる参照へのリンクを追加できますか?ユニークなものは何ですか?一意性も明確にしてください。XML名前空間の名前ですか、それともURLのコンテンツですか。乾杯
olibre

@olibre androidの名前空間を使用する場合は、名前を使用する必要があります。それが彼らのユニークな名前です。彼らはそこにURLを置くことにしました。独自の名前空間を作成している場合は、名前が一意であることを確認して、名前を付けることができます。その名前空間内の内容を説明する場所を指すURLを使用する必要があると言われていますが、ご覧のとおり、Android名前空間の作成者でさえもそれを行いませんでした。
モルフィドン2017

モルフィドンに感謝します。ロブの答えを読みながら、私はようやくその点を理解しました。よく知られていない重要な側面を強調しているので、私はあなたの答えが好きです。しかし、あなたの答えを改善し、どの部分が一意でなければならないかを明確にし、参照を提供し、言い換え、言い回しをチェックしてください...一部の読者はあなたの現在の答えに混乱するかもしれません。乾杯
olibre

1
これが私が必要とした答えです!この属性値にURIを使用するのは紛らわしいです。人々はURI = URLを考え、その場所にドキュメントが存在することを期待しているからです。ただし、AFAICTでは、URIが404を返しても問題ありません。これは、たまたまアドレスのように見える一意の識別子です。その場所でスキーマまたはDTDを見つけることを期待するいくつかの特別なバリデーターがあるかもしれませんが(これは理にかなっています)、これらは私が思う特別なケースです。ここで間違っている場合は修正してください。
brennanyoung

1
@brennanyoungそれはあなたが言ったとおりです:)
モルフィドン

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>

node1つのxmlファイル内の2つの異なる要素。名前空間がないと、このファイルは無効になります。


4

名前空間があるため、グローバルに一意の要素を持つことができます。ただし、99%の場合、これはそれほど重要ではありませんが、セマンティックWebの観点から考えると、重要になります。

たとえば、適切なを使用するだけで、さまざまなスキームのXMLマッシュアップを作成できますxmlns。たとえば、友達の友達をvCardでマッシュアップします


ささいなxmlの場合は無視してもかまいません。他のすべての名前空間は非常に重要です。+セマンティックWebと名前空間の間の関係が本当にわかりません。セマンティックWebは概念であり、名前空間はXML標準の一部であり、インターフェースの定義と実装の詳細が混在しています。
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.