456

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

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

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

それは何ですか?

4

5 に答える 5

731

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>
于 2009-07-25T11:41:49.433 に答える
318

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/

于 2009-07-25T11:25:29.340 に答える
19

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

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

次のように呼ぶこともできます:

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

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

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

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

于 2016-02-17T14:23:21.680 に答える
14

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つの異なる要素。名前空間がないと、このファイルは無効になります。

于 2015-06-08T20:13:18.110 に答える
4

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

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

于 2009-07-26T09:40:13.680 に答える