web-dev-qa-db-ja.com

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

XMLファイルに次の行があります。

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

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

それは何ですか?

386
user88637

それは XML名前空間 を定義します。

あなたの例では、名前空間プレフィックスは " Android "で、名前空間URIです。 "http://schemas.Android.com/apk/res/Android"です

この文書では、<Android:foo />のような要素が見られます。

名前空間の接頭辞は、完全な名前空間URIの短い名前のエイリアスを持つ変数と考えてください。 XMLパーサーが文書を読むときの「意味」は、<http://schemas.Android.com/apk/res/Android:foo />と書くのと同じです。

注: XMLインスタンス文書では、名前空間の接頭辞の代わりに完全な名前空間URIを使用することはできません。 .

このチュートリアルのネームスペースをチェックしてください。 http://www.sitepoint.com/xml-namespaces-explained/

279
Mads Hansen

これは 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が両方とも同じ名前空間にマッピングされている場合(以下のスニペットのように)、特定の要素の前に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>
640
Rob Levine

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>

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

11
Iurii

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

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

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

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

これは単なる一意の識別子です。ただし、一意であり、そのネームスペースで使用されているタグ/属性の指定を示す可能性があるURLをそこに配置する必要があることが確立されています。それは必要ではありません。

なぜそれはユニークなはずですか?名前空間の目的はそれらを一意にすることなので、たとえば名前空間のbackgroundという属性はと区別できます。別のネームスペースのbackground

その独自性のため、あなたがあなたがあなたのカスタム属性を作成するならばあなたが名前衝突を持つことになるのを心配する必要はありません。

11
Morfidon

名前空間があるので、グローバルに一意の要素を持つことができます。しかし、99%の時間でこれは重要ではありませんが、 The Semantic Web の観点から考えると、重要になり始めています。 。

たとえば、適切なxmlnsを使用するだけで、さまざまな方式のXMLマッシュアップを作成できます。たとえば、友人の友人を vCard などとマッシュアップします。

4
Jon

XML名前空間は要素名の衝突を避けるための方法を提供します。 XMLでは、要素名は開発者によって定義されます。異なるXMLアプリケーションからのXML文書を混在させようとすると、これはしばしば衝突を引き起こします。

XMLでの名前の競合は、名前の接頭辞を使用して簡単に回避できます。XMLで接頭辞を使用する場合は、接頭辞の名前空間を定義する必要があります。

名前空間は、要素の開始タグ内のxmlns属性によって定義できます。名前空間宣言の構文は以下のとおりです。 xmlns:prefix = "URI"

0
Neeraj Gahlawat