Was bedeutet "xmlns" in XML?

415

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

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

Ich habe auch xmlnsin vielen anderen XML-Dateien gesehen, auf die ich gestoßen bin.

Was ist es?

user88637
quelle
Schauen Sie mal
rein
Jetzt hätten Sie auch erfahren müssen, warum wir Fehler in der XML erhalten, wenn wir die Tags falsch oder an der falschen Stelle verwenden. :)
Vaibs

Antworten:

299

Es definiert einen XML-Namespace .

In Ihrem Beispiel lautet das Namespace-Präfix " android " und der Namespace-URI " http://schemas.android.com/apk/res/android ".

Im Dokument sehen 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 <http://schemas.android.com/apk/res/android:foo />in Bezug auf das, was es "bedeutet", wenn ein XML-Parser das Dokument liest.

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

Schauen Sie sich dieses Tutorial zu Namespaces an: http://www.sitepoint.com/xml-namespaces-explained/

Mads Hansen
quelle
62
Ich füge diese URIs immer in einen Webbrowser ein, um zu sehen, was der Parser sieht, aber er gibt immer 404 zurück. Soll es sich um eine echte URI handeln, für die ein Standarddateiname erforderlich ist, oder handelt es sich nur um eine Technik? für die Erstellung einer eindeutigen ID?
Patrick
36
@Patrick Ja, es ist nur eine URI, die eindeutig sein muss, um anzuzeigen, dass es sich um einen von anderen getrennten Namespace handelt und potenzielle doppelte Tags daher korrekt interpretiert werden. Daher zeigt der URI oft auf nichts.
Foochow
3
Hmm ... gut zu wissen, dass es ein Namespace ist. Früher habe ich mich gefragt, ob durch die Angabe eines URI die HTML-Seite tatsächlich auf diese Website zugreift, um ein Schema zu bestimmen.
Nav
17
@Patrick, URI ist nicht dasselbe wie URL. Eine URL ist ein Locator und eine URI ist nur eine Kennung. Sie können sehr gut eine GUID als URI auswählen. Tatsächlich ist die ISBN, die wir für Bücher haben, eine Form der URI.
Jaywalker
Wie funktionieren dann Tags? Ich meine <LinearLayoutfunktioniert ohne Präfix?
Asif Mushtaq
676

Es bedeutet XML-Namespace .

Grundsätzlich gehört jedes Element (oder Attribut) in XML zu einem Namespace, um den Namen des Elements zu "qualifizieren".

Stellen Sie sich vor, Sie und ich erfinden beide unser eigenes XML. Sie erfinden XML, um Menschen zu beschreiben, ich erfinde meins, um Städte zu beschreiben. Wir beide enthalten ein Element namens name. Ihre bezieht sich auf den Namen der Person und meine auf den Namen der Stadt - OK, es ist ein bisschen erfunden.

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

Wenn unsere beiden XMLs zu einem einzigen Dokument zusammengefasst würden, wie würden wir die beiden Namen voneinander unterscheiden? Wie Sie oben sehen können, gibt es zwei nameElemente, die jedoch unterschiedliche Bedeutungen haben.

Die Antwort ist, dass Sie und ich unserem XML 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>

Nachdem wir unser XML vollständig qualifiziert haben, gibt es keine Unklarheiten darüber, was jedes nameElement bedeutet. Alle Tags, die mit beginnen, personxml:sind Tags, die zu Ihrem XML gehören. Alle, die mit beginnen, cityxml:gehören mir.

Es gibt einige Punkte zu beachten:

  • Wenn Sie Namespace-Deklarationen ausschließen, werden die Dinge als Standard-Namespace betrachtet.

  • Wenn Sie einen Namespace ohne die Kennung erklären, dass, ist xmlns="http://somenamespace", anstatt xmlns:rob="somenamespace", gibt es das Standard - Namespace für das Dokument.

  • Der eigentliche Namespace selbst, häufig ein IRI , hat keine wirkliche Konsequenz. Es sollte einzigartig sein, daher neigen die Leute dazu, eine IRI / URI zu wählen, die sie besitzen, aber es hat keine größere Bedeutung als diese. Manchmal platzieren Leute das Schema (die Definition) für das XML an der angegebenen IRI, aber das ist eine Konvention nur einiger Leute.

  • Das Präfix ist ebenfalls ohne Bedeutung. Entscheidend ist nur, als welchen Namespace das Präfix definiert ist. Mehrere Tags, die mit unterschiedlichen Präfixen beginnen und alle demselben Namespace zugeordnet sind, gelten als gleich.

    Wenn beispielsweise die Präfixe personxmlund mycityxmlbeide demselben Namespace zugeordnet sind (wie im folgenden Snippet), spielt es keine Rolle, ob Sie einem bestimmten Element ein personxmloder ein Präfix mycityxmlvoranstellen. Beide werden von einem XML-Parser als dasselbe behandelt . Der Punkt ist, dass es einem XML-Parser egal ist, was Sie als Präfix ausgewählt haben, sondern nur der Namespace, den er ebenfalls zuordnet. Das Präfix ist nur eine Indirektion, 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 werden, sind es aber im Allgemeinen nicht. Sie erben ihren Namespace auch nicht von dem Element, auf dem sie sich befinden, im Gegensatz zu Elementen (siehe unten).

Außerdem werden Element-Namespaces vom übergeordneten Element geerbt. Mit anderen Worten, ich hätte das obige XML genauso schreiben können wie

<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>
Rob Levine
quelle
13
+1 gute, hilfreiche konzeptionelle Antwort. Möglicherweise möchten Sie "Grundsätzlich gehört jedes Element (oder Attribut) in XML zu einem Namespace" qualifizieren, da einige Elemente und Attribute als "kein Namespace" bezeichnet werden. Obwohl ich verstehe, dass Sie die Grundlagen gegeben haben.
LarsH
1
@Rob Levine "Attribute können einen Namespace haben, sind es aber im Allgemeinen nicht." Was ist mit Android?
Paul Brewczynski
1
Wie wird beispielsweise " your.example.com/xml/person " verwendet? Ok, ich habe ein <person: name> -Tag. Was nun? Können Sie das bitte auch erklären?
Koray Tugay
1
@WORMSS - Ja - du hast recht. Wenn Sie Ihre Abfrage definieren, müssen Sie den Namespace angeben, wahrscheinlich über ein Präfix. In der C # System.Xml-Welt würden Sie beispielsweise ein Präfix beim Namespace-Manager mithilfe von XmlNamespaceManager.AddNamespace registrieren und dieses Präfix dann in Ihrer Abfrage verwenden. Die Tatsache, dass das Präfix nicht im Dokument angezeigt wird, spielt keine Rolle - nur welcher Namespace wird ebenfalls zugeordnet.
Rob Levine
2
Dieser Microsoft-Dokumentlink: " msdn.microsoft.com/en-us/library/aa468565.aspx " erklärt den Namespace in XML sehr sehr gut.
Deen John
16

Ich denke, die größte Verwirrung ist, dass der XML-Namespace auf eine URL verweist, die keine Informationen enthält. Aber die Wahrheit ist, dass die Person, die unter dem 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 eine eindeutige Kennung. Es wird jedoch festgelegt, dass Sie eine eindeutige URL eingeben sollten, die möglicherweise auf die Angabe der verwendeten Tags / Attribute in diesem Namespace verweisen kann. Es ist aber nicht erforderlich.

Warum sollte es einzigartig sein? Da Namespaces den Zweck haben, sie eindeutig zu haben, kann das Attribut, beispielsweise Hintergrund aus Ihrem Namespace genannt, vom Hintergrund eines anderen Namespace unterschieden werden.

Aufgrund dieser Einzigartigkeit müssen Sie sich keine Sorgen machen, dass beim Erstellen Ihres benutzerdefinierten Attributs eine Namenskollision auftritt.

Morfidon
quelle
Hallo Morfidon. Könnten Sie Ihrer Antwort bitte einen Link zu einer Referenz hinzufügen, die angibt, dass der Inhalt oder die URL alles sein können? Was muss einzigartig sein? Bitte klären Sie auch die Eindeutigkeit: Der Name des XML-Namespace oder der Inhalt der URL? Cheers
Olibre
@olibre Wenn Sie den Namespace von Android verwenden möchten, sollten Sie dessen Namen verwenden. Das ist ihr einzigartiger Name. Sie beschlossen, dort eine URL zu setzen. Wenn Sie Ihren eigenen Namespace erstellen, können Sie ihn so nennen, wie Sie möchten. Stellen Sie nur sicher, dass er eindeutig ist. Es wird gesagt, dass Sie eine URL verwenden sollten, die auf die Stelle verweist, an der Sie beschreiben, was sich in diesem Namespace befindet, aber wie Sie sehen können, haben es selbst die Ersteller des Android-Namespace nicht getan.
Morfidon
Danke Morfidon. Ich habe diesen Punkt endlich verstanden, als ich die Antwort von Rob gelesen habe . Ich mag Ihre Antwort, weil sie einen wichtigen Aspekt hervorhebt, der nicht bekannt ist. Aber bitte versuchen Sie, Ihre Antwort zu verbessern, zu klären, welcher Teil eindeutig sein muss, Referenzen anzugeben, neu zu formulieren, den Wortlaut zu überprüfen ... Einige Leser sind möglicherweise durch Ihre aktuelle Antwort verwirrt. Prost
olibre
1
Das ist die Antwort, die ich brauchte! Es ist daher verwirrend, einen URI für diesen Attributwert zu verwenden, da die Leute URI = URL denken und erwarten, dass sich ein Dokument am Speicherort befindet. Aber AFAICT, es ist völlig in Ordnung, wenn der URI eine 404 zurückgibt. Es ist nur eine eindeutige Kennung, die zufällig wie eine Adresse aussieht. Es mag einige spezielle Validatoren geben, die erwarten, an dieser Stelle ein Schema oder eine DTD zu finden (was sinnvoll wäre), aber dies sind meiner Meinung nach Sonderfälle. Bitte korrigieren Sie mich, wenn ich hier falsch liege.
brennanyoung
1
@ brennanyoung es ist genau wie du gesagt hast :)
Morfidon
12

xmlns - XML-Namespace. Dies ist nur eine Methode, um Konflikte mit Elementnamen 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 nodeElemente in einer XML-Datei. Ohne Namespaces wäre diese Datei nicht gültig.

Yuriy
quelle
4

Sie haben Namensräume, damit Sie global eindeutige Elemente haben können. In 99% der Fälle spielt dies jedoch keine Rolle, aber wenn Sie es in die Perspektive des Semantic Web stellen , wird es immer wichtiger.

Sie können beispielsweise ein XML-Mashup verschiedener Schemata erstellen, indem Sie das entsprechende Schema verwenden xmlns. Mischen Sie beispielsweise einen Freund eines Freundes mit einer vCard usw.

Jon
quelle
für triviales XML könnte es mich ignorieren, für alles andere sind Namespaces extrem wichtig. + Ich sehe die Verbindung zwischen Semantic Web und Namespace wirklich nicht. Das Semantic Web ist ein Konzept, der Namespace ist Teil des XML-Standards, Sie mischen Schnittstellendefinition und Implementierungsdetails.
Newtopian