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>


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow