xml
Namensräume
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>