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>


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow