Ricerca…
Osservazioni
I nomi di elementi e attributi in XML sono chiamati QNames (nomi qualificati).
Un QName è composto da:
- uno spazio dei nomi (un URI)
- un prefisso (un NCName, NC perché non contiene due punti)
- un nome locale (un NCName)
Solo lo spazio dei nomi e il nome locale sono rilevanti per confrontare due QName. Il prefisso è solo un proxy per lo spazio dei nomi.
Lo spazio dei nomi e il prefisso sono facoltativi, ma lo spazio dei nomi è sempre presente se il prefisso è presente (questo è garantito a livello sintattico, quindi non può essere fatto in modo errato).
La rappresentazione lessicale di un QName è il prefix:local-name
. Lo spazio dei nomi viene associato separatamente utilizzando gli attributi xmlns:...
speciali (promemoria: gli attributi che iniziano con xml sono riservati in XML).
Se il prefisso è vuoto, non viene utilizzato alcun segno nella rappresentazione lessicale di QName, che contiene solo il local-name
. QNome con un prefisso vuoto non hanno spazio dei nomi (se non c'è spazio predefinito nello spazio) o si trovano nello spazio dei nomi predefinito.
Associare un prefisso a uno spazio dei nomi
Uno spazio dei nomi è un URI, ma per evitare la verbosità, i prefissi vengono utilizzati come proxy.
Nell'esempio seguente, il prefisso my-prefix
è associato allo spazio dei nomi http://www.example.com/my-namespace
utilizzando l'attributo speciale xmlns:my-prefix
( my-prefix
può essere sostituito con qualsiasi altro prefisso) :
<?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>
Assenza di spazio dei nomi
In XML, i nomi di elementi e attributi vivono in spazi dei nomi.
Per impostazione predefinita, non hanno spazio dei nomi:
<?xml version="1.0"?>
<foo attr="value">
<!-- the foo element is in no namespace, neither is the attr attribute -->
</foo>
Irrilevanza dei prefissi
Questi due documenti sono equamente semanticamente, come lo spazio dei nomi importa, non i prefissi.
<?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>
Spazio dei nomi predefinito
Lo spazio dei nomi predefinito è lo spazio dei nomi corrispondente all'assenza di qualsiasi prefisso. Può essere dichiarato con l'attributo xmlns
speciale.
<?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>
Se non viene dichiarato alcun namespace predefinito, i nomi senza prefisso non sono nello spazio dei nomi.
Nomi di attributi senza prefisso
Gli elementi e gli attributi si comportano in modo diverso rispetto agli spazi dei nomi predefiniti. Questo è spesso fonte di confusione.
Un attributo il cui nome non ha prefisso risiede in nessuno spazio dei nomi, anche quando uno spazio dei nomi predefinito è in ambito .
<?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>
Portata dei vincoli dello spazio dei nomi
Un bind di namespace (attributo xmlns
o xmlns:...
speciale) è in ambito per tutti i discendenti dell'elemento di inclusione, incluso questo elemento.
<?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>
Il bind può essere annullato in un elemento nidificato (questo però influisce sulla leggibilità):
<?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>
È molto comune dichiarare tutti i collegamenti di namespace nell'elemento root, che migliora la leggibilità.
<?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>