Ich habe die folgende Zeile in einer XML-Datei gesehen:
xmlns:android="http://schemas.android.com/apk/res/android"
Ich habe auch xmlns
in vielen anderen XML-Dateien gesehen, auf die ich gestoßen bin.
Was ist es?
Ich habe die folgende Zeile in einer XML-Datei gesehen:
xmlns:android="http://schemas.android.com/apk/res/android"
Ich habe auch xmlns
in vielen anderen XML-Dateien gesehen, auf die ich gestoßen bin.
Was ist es?
Antworten:
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/
<LinearLayout
funktioniert ohne Präfix?
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 name
Elemente, 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 name
Element 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 personxml
und mycityxml
beide demselben Namespace zugeordnet sind (wie im folgenden Snippet), spielt es keine Rolle, ob Sie einem bestimmten Element ein personxml
oder ein Präfix mycityxml
voranstellen. 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>
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.
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 node
Elemente in einer XML-Datei. Ohne Namespaces wäre diese Datei nicht gültig.
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.