Suche…


Bemerkungen

Element- und Attributnamen in XML werden als QNames (qualifizierte Namen) bezeichnet.

Ein QName besteht aus:

  • ein Namespace (ein URI)
  • ein Präfix (NCName, weil es keinen Doppelpunkt enthält)
  • ein lokaler Name (ein NCName)

Nur der Namespace und der lokale Name sind für den Vergleich zweier QNames relevant. Das Präfix ist nur ein Proxy für den Namespace.

Der Namespace und das Präfix sind optional, der Namespace ist jedoch immer vorhanden, wenn das Präfix vorhanden ist (dies ist auf syntaktischer Ebene sichergestellt, daher kann dies nicht falsch gemacht werden).

Die lexikalische Darstellung eines QName ist das prefix:local-name . Der Namespace wird separat mit den speziellen Attributen xmlns:... gebunden (Erinnerung: Attribute, die mit xml beginnen, sind in XML reserviert).

Wenn das Präfix leer ist, wird in der lexikalischen Darstellung von QName kein Doppelpunkt verwendet, der nur den local-name . QNames mit leerem Präfix haben entweder keinen Namespace (wenn sich kein Standard-Namespace im Gültigkeitsbereich befindet) oder sie befinden sich im Standard-Namespace.

Binden Sie ein Präfix an einen Namespace

Ein Namespace ist ein URI. Um die Ausführlichkeit zu vermeiden, werden Präfixe als Proxy verwendet.

Im folgenden Beispiel wird das Präfix my-prefix auf den Namespace gebunden ist http://www.example.com/my-namespace unter Verwendung der speziellen Attribut xmlns:my-prefix ( my-prefix werden kann mit jedem anderen Präfix ersetzt) :

<?xml version="1.0"?>
<my-prefix:foo xmlns:my-prefix="http://www.example.com/my-namespace">
  <!-- the element my-prefix:foo
       lives in the namespace http://www.example.com/my-namespace -->
</my-prefix:foo>

Fehlender Namespace

In XML leben Element- und Attributnamen in Namespaces.

Standardmäßig befinden sie sich in keinem Namespace:

<?xml version="1.0"?>
<foo attr="value">
  <!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>

Irrelevanz von Präfixen

Diese beiden Dokumente sind semantisch gleichwertig, da Namespaces eine Rolle spielen und keine Präfixe.

<?xml version="1.0"?>
<myns:foo xmlns:myns="http://www.example.com/my-namespace">
</myns:foo>

<?xml version="1.0"?>
<ns:foo xmlns:ns="http://www.example.com/my-namespace">
</ns:foo>

Standard-Namespace

Der Standardnamespace ist der Namespace, der dem Fehlen eines Präfixes entspricht. Es kann mit dem speziellen xmlns Attribut deklariert werden.

<?xml version="1.0"?>
<foo xmlns="http://www.example.com/my-namespace">
  <!-- the element foo is in the namespace
       http://www.example.com/my-namespace -->
</foo>

Wenn kein Standard-Namespace deklariert ist, befinden sich Namen ohne Präfix in keinem Namespace.

Attributnamen ohne Präfix

Elemente und Attribute verhalten sich in Bezug auf Standard-Namespaces unterschiedlich. Dies ist oft die Quelle der Verwirrung.

Ein Attribut, dessen Name kein Präfix hat, lebt in keinem Namespace, auch wenn sich ein Standard-Namespace im Gültigkeitsbereich befindet .

<?xml version="1.0"?>
<foo attr="value" xmlns="http://www.example.com/my-namespace">
  <!-- The attribute attr is in no namespace, even though
       a default namespace is in scope. The element foo,
       however, is in the default namespace. -->
</foo>

Umfang der Namensraumbindungen

Eine Namensraumbindung (spezielles Attribut xmlns oder xmlns:... ) gilt für alle Nachkommen des umgebenden Elements, einschließlich dieses Elements.

<?xml version="1.0"?>
<root>
  <my:element xmlns:my="http://www.example.com/ns1">
    <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  </my:element>
  <my:element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2 -->
  </my:element>
</root>

Die Bindung kann in einem verschachtelten Element überschrieben werden (dies wirkt sich jedoch auf die Lesbarkeit aus):

<?xml version="1.0"?>
<my:element xmlns:my="http://www.example.com/ns1">
  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:first-child-element/>

  <my:child-element xmlns:my="http://www.example.com/ns2">
    <!-- here, the prefix my is bound to http://www.example.com/ns2,
         including for the element my:child-element -->
  </my:child-element>

  <!-- here, the prefix my is bound to http://www.example.com/ns1 -->
  <my:last-child-element/>

</my:element>

Es ist üblich, alle Namespace-Bindungen im Root-Element zu deklarieren, wodurch die Lesbarkeit verbessert wird.

<?xml version="1.0"?>
<root
  xmlns="http://www.example.com/default-namespace"
  xmlns:ns1="http://www.example.com/ns1"
  xmlns:ns2="http://www.example.com/ns2">
  
  <ns1:element>
    <ns2:other-element/>
  </ns1:element>

</root>


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow