Zoeken…
Opmerkingen
Element- en kenmerknamen in XML worden QNames (gekwalificeerde namen) genoemd.
Een QName bestaat uit:
- een naamruimte (een URI)
- een voorvoegsel (een NCName, NC omdat deze geen dubbele punt bevat)
- een lokale naam (een NCName)
Alleen de naamruimte en de lokale naam zijn relevant voor het vergelijken van twee QNames. Het voorvoegsel is alleen een proxy voor de naamruimte.
De naamruimte en het voorvoegsel zijn optioneel, maar de naamruimte is altijd aanwezig als het voorvoegsel aanwezig is (dit wordt op syntactisch niveau gewaarborgd, dus dit kan niet verkeerd worden gedaan).
De lexicale weergave van een QName is het prefix:local-name
. De naamruimte wordt afzonderlijk gebonden met behulp van de speciale xmlns:...
attributen (herinnering: attributen die beginnen met xml zijn gereserveerd in XML).
Als het voorvoegsel leeg is, wordt geen dubbele punt gebruikt in de lexicale weergave van de QName, die alleen de local-name
. QNamen met een leeg voorvoegsel hebben ofwel geen naamruimte (als er geen standaardnaamruimte is) of bevinden zich in de standaardnaamruimte.
Bind een voorvoegsel aan een naamruimte
Een naamruimte is een URI, maar om verbosity te voorkomen, worden voorvoegsels gebruikt als proxy.
In het volgende voorbeeld is het voorvoegsel my-prefix
gebonden aan de naamruimte http://www.example.com/my-namespace
met behulp van het speciale kenmerk xmlns:my-prefix
( my-prefix
kan worden vervangen door een ander prefix) :
<?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>
Afwezigheid van naamruimte
In XML leven element- en attribuutnamen in naamruimten.
Standaard staan ze niet in een naamruimte:
<?xml version="1.0"?>
<foo attr="value">
<!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>
Irrelevantie van voorvoegsels
Deze twee documenten zijn semantisch equivalent, omdat naamruimten ertoe doen, geen voorvoegsels.
<?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>
Standaard naamruimte
De standaardnaamruimte is de naamruimte die overeenkomt met de afwezigheid van een voorvoegsel. Het kan worden gedeclareerd met het speciale xmlns
kenmerk.
<?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>
Als er geen standaardnaamruimte wordt gedeclareerd, staan namen zonder voorvoegsel in geen naamruimte.
Attribuutnamen zonder voorvoegsel
Elementen en attributen gedragen zich anders ten opzichte van standaardnaamruimten. Dit is vaak de oorzaak van verwarring.
Een kenmerk waarvan de naam geen voorvoegsel heeft, leeft in geen naamruimte, ook wanneer een standaardnaamruimte binnen het bereik valt .
<?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>
Scope van naamruimte bindingen
Een binding van een naamruimte (speciale xmlns
of xmlns:...
attribuut) is in het bereik voor alle afstammelingen van het omsluitende element, inclusief dit element.
<?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>
De binding kan worden opgeheven in een genest element (dit heeft echter invloed op de leesbaarheid):
<?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>
Het is heel gebruikelijk om alle naamruimte bindingen in het root-element te declareren, wat de leesbaarheid verbetert.
<?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>