500 Stimmen

Was bedeutet "xmlns" in XML?

Ich habe die folgende Zeile in einer XML-Datei gesehen:

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

Ich habe auch gesehen xmlns in vielen anderen XML-Dateien, denen ich begegnet bin.

Was ist das?

813voto

Rob Levine Punkte 38688

Das bedeutet XML-Namensraum .

Im Grunde genommen ist jedes Element (oder Attribut) in XML zu einem Namespace gehört, eine Möglichkeit, den Namen des Elements zu "qualifizieren".

Stellen Sie sich vor, Sie und ich erfinden unsere eigene XML. Sie erfinden XML, um Menschen zu beschreiben, ich erfinde meines, um Städte zu beschreiben. Beide von uns enthalten ein Element namens name . Sie beziehen sich auf den Namen der Person und ich auf den Namen der Stadt - okay, das ist ein bisschen konstruiert.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Wenn unsere beiden XML-Dateien in einem einzigen Dokument kombiniert würden, wie würden wir die beiden Namen unterscheiden? Wie Sie oben sehen können, gibt es zwei name Elemente, aber beide haben unterschiedliche Bedeutungen.

Die Antwort ist, dass wir beide unserer XML-Datei einen Namespace zuweisen würden, den wir eindeutig machen würden:

<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>

Jetzt, wo wir unser XML vollständig qualifiziert haben, gibt es keine Unklarheiten mehr darüber, was die einzelnen name Element bedeutet. Alle Tags, die mit personxml: sind Tags, die zu Ihrem XML gehören, alle, die mit cityxml: sind meine.

Es sind einige Punkte zu beachten:

  • Wenn Sie Namespace-Deklarationen ausschließen, wird davon ausgegangen, dass die Dinge im Standard-Namespace liegen.

  • Wenn Sie einen Namespace ohne den Bezeichner deklarieren, ist das so, xmlns="http://somenamespace" statt xmlns:rob="somenamespace" gibt er den Standard-Namensraum für das Dokument an.

  • Der eigentliche Namensraum selbst, oft ein IRI ist nicht wirklich von Bedeutung. Sie sollte eindeutig sein, daher neigen die Leute dazu, eine IRI/URI zu wählen, die ihnen gehört, aber sie hat keine größere Bedeutung als das. Manchmal wird das Schema (Definition) für die XML-Datei an der angegebenen IRI platziert, aber das ist nur eine Konvention einiger Leute.

  • Auch die Vorsilbe ist nicht von Bedeutung. Wichtig ist nur, als welcher Namensraum das Präfix definiert ist. Mehrere Tags, die mit unterschiedlichen Präfixen beginnen und alle auf denselben Namespace verweisen, werden als ein und dasselbe betrachtet.

    Zum Beispiel, wenn die Präfixe personxml y mycityxml demselben Namespace zugeordnet sind (wie in dem unten stehenden Ausschnitt), wäre es egal, ob Sie einem bestimmten Element das Präfix personxml o mycityxml werden beide von einem XML-Parser als das Gleiche behandelt. Der Punkt ist, dass ein XML-Parser sich nicht darum kümmert, was Sie als Präfix gewählt haben, sondern nur um den Namespace, dem es zugeordnet ist. Das Präfix ist nur ein Umleitung die auf den Namespace verweist.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Attribute können qualifiziert sein, sind es aber im Allgemeinen nicht. Sie tun auch no erben ihren Namensraum von dem Element, auf dem sie stehen, im Gegensatz zu Elementen (siehe unten).

Außerdem werden die Namensräume der Elemente vom übergeordneten Element geerbt. Mit anderen Worten, ich hätte die obige XML-Datei auch so schreiben können

<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>

325voto

Mads Hansen Punkte 58777

Sie definiert eine XML-Namensraum .

In Ihrem Beispiel ist die Namespace-Präfix ist " Android " und die Namespace-URI ist " http://schemas.Android.com/apk/res/Android "

In dem Dokument finden Sie Elemente wie: <android:foo />

Stellen Sie sich das Namespace-Präfix als eine Variable mit einem Kurznamen-Alias für den vollständigen Namespace-URI vor. Es ist das Äquivalent zum Schreiben von <http://schemas.android.com/apk/res/android:foo /> im Hinblick darauf, was es "bedeutet", wenn ein XML-Parser das Dokument liest.

HINWEIS: Sie können nicht den vollständigen Namespace-URI anstelle des Namespace-Präfixes in einem XML-Instanzdokument verwenden.

Sehen Sie sich dieses Tutorial über Namespaces an: http://www.sitepoint.com/xml-namespaces-explained/

24voto

Morfidon Punkte 1199

Ich denke, die größte Verwirrung besteht darin, dass xml namespace auf eine Art URL verweist, die keine Informationen enthält. Aber die Wahrheit ist, dass die Person, die unten Namespace erfunden hat:

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

könnte es auch so nennen:

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

Dies ist nur ein eindeutiger Bezeichner. Es hat sich jedoch bewährt, eine URL anzugeben, die eindeutig ist und möglicherweise auf die Spezifikation der verwendeten Tags/Attribute in diesem Namensraum verweist. Dies ist jedoch nicht erforderlich.

Warum sollte es einzigartig sein? Weil Namespaces den Zweck haben, eindeutig zu sein, so dass zum Beispiel das Attribut Hintergrund aus Ihrem Namespace kann von der Hintergrund aus einem anderen Namespace.

Aufgrund dieser Einzigartigkeit müssen Sie nicht befürchten, dass es bei der Erstellung Ihres benutzerdefinierten Attributs zu Namenskollisionen kommt.

14voto

Iurii Vasylenko Punkte 2952

Xmlns - xml Namespace. Es ist nur eine Methode, um Namenskonflikte zwischen Elementen zu vermeiden. Zum Beispiel:

<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>

Zwei verschiedene node Elemente in einer xml-Datei. Ohne Namespaces wäre diese Datei nicht gültig.

4voto

Jon Punkte 4275

Sie haben Namensräume, so dass Sie global eindeutige Elemente haben können. In 99 % der Fälle spielt dies jedoch keine Rolle, aber wenn Sie es aus der Perspektive von Das semantische Web beginnt sie wichtig zu werden.

Sie können zum Beispiel ein XML-Mash-up verschiedener Schemata erstellen, indem Sie einfach die entsprechenden xmlns . Zum Beispiel kann man den Freund eines Freundes mit vCard , usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X