Che cosa significa "xmlns" in XML?


415

Ho visto la seguente riga in un file XML:

xmlns:android="http://schemas.android.com/apk/res/android"

Ho anche visto xmlns in molti altri file XML che ho incontrato.

Che cos'è?




Ora dovresti anche sapere questo perché riceviamo errori nell'xml quando usiamo i tag in modo errato o nel posto sbagliato. :)
Vaibs,

Risposte:


299

Definisce uno spazio dei nomi XML .

Nel tuo esempio, il prefisso dello spazio dei nomi è " android " e l' URI dello spazio dei nomi è " http://schemas.android.com/apk/res/android "

Nel documento vengono visualizzati elementi come: <android:foo />

Pensa al prefisso dello spazio dei nomi come una variabile con un alias nome breve per l'URI dello spazio dei nomi completo. È l'equivalente della scrittura <http://schemas.android.com/apk/res/android:foo />riguardo a ciò che "significa" quando un parser XML legge il documento.

NOTA: non è possibile effettivamente utilizzare l'URI dello spazio dei nomi completo al posto del prefisso dello spazio dei nomi in un documento di istanza XML.

Dai un'occhiata a questo tutorial su namespace: http://www.sitepoint.com/xml-namespaces-explained/


62
Ho sempre incollato quegli URI in un browser Web solo per vedere cosa sta guardando il parser, ma restituisce sempre 404. Dovrebbe essere un vero URI che ha bisogno di un nome di file standard incollato alla fine, o è solo una tecnica per aver creato un ID unico?
Patrick,

36
@Patrick sì, è solo un URI che deve essere univoco in modo da indicare che è uno spazio dei nomi separato dagli altri e che eventuali tag duplicati verranno quindi interpretati correttamente. Quindi l'URI spesso non indicherà nulla.
febbraio

3
Hmm ... bello sapere che è uno spazio dei nomi. Mi chiedevo se la specifica di un URI consentisse alla pagina HTML di accedere effettivamente a quel sito Web per determinare uno schema.
Nav

17
@Patrick, l'URI non è uguale all'URL. Un URL è un localizzatore e un URI è solo un identificatore. Potresti benissimo scegliere un GUID come URI. In realtà, il codice ISBN che abbiamo per i libri è una forma di URI.
Jaywalker,

allora come funzionano i tag? Voglio dire <LinearLayoutfunziona senza prefisso?
Asif Mushtaq

676

Significa spazio dei nomi XML .

Fondamentalmente, ogni elemento (o attributo) in XML appartiene a uno spazio dei nomi, un modo di "qualificare" il nome dell'elemento.

Immagina che entrambi inventiamo il nostro XML. Tu inventi XML per descrivere le persone, io invento le mie per descrivere le città. Entrambi includono un elemento chiamato name. Il tuo si riferisce al nome della persona e il mio al nome della città - OK, è un po 'inventato.

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

Se i nostri due XML fossero combinati in un unico documento, come distingueremmo i due nomi? Come puoi vedere sopra, ci sono due nameelementi, ma entrambi hanno significati diversi.

La risposta è che entrambi assegneremmo uno spazio dei nomi al nostro XML, che renderemmo unico:

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

Ora abbiamo pienamente qualificato il nostro XML, non vi è alcuna ambiguità sul namesignificato di ciascun elemento. Tutti i tag che iniziano con personxml:sono tag appartenenti al tuo XML, tutti quelli che iniziano con cityxml:sono miei.

Ci sono alcuni punti da notare:

  • Se si escludono dichiarazioni dello spazio dei nomi, le cose vengono considerate nello spazio dei nomi predefinito.

  • Se si dichiara uno spazio dei nomi senza identificatore, ovvero xmlns="http://somenamespace", anziché anziché xmlns:rob="somenamespace", specifica lo spazio dei nomi predefinito per il documento.

  • Lo stesso spazio dei nomi stesso, spesso un IRI , non ha alcuna reale conseguenza. Dovrebbe essere unico, quindi le persone tendono a scegliere un IRI / URI di loro proprietà, ma non ha un significato più grande di quello. A volte le persone posizionano lo schema (definizione) per l'XML all'IRI specificato, ma questa è una convenzione solo di alcune persone.

  • Anche il prefisso non ha alcuna conseguenza. L'unica cosa che conta è lo spazio dei nomi definito dal prefisso. Numerosi tag che iniziano con prefissi diversi, tutti associati allo stesso spazio dei nomi sono considerati uguali.

    Ad esempio, se i prefissi personxmled mycityxmlentrambi sono mappati allo stesso spazio dei nomi (come nello snippet di seguito), non importa se si antepone un determinato elemento con personxmlo mycityxml, entrambi verrebbero trattati come la stessa cosa da un parser XML . Il punto è che un parser XML non si preoccupa di ciò che hai scelto come prefisso, ma solo dello spazio dei nomi che mappa. Il prefisso è solo una indiretta che punta allo spazio dei nomi.

    <personxml:person 
         xmlns:personxml="http://example.com/same/url"
         xmlns:mycityxml="http://example.com/same/url" />
  • Gli attributi possono essere qualificati ma generalmente non lo sono. Inoltre, non ereditano il loro spazio dei nomi dall'elemento in cui si trovano, al contrario degli elementi (vedi sotto).

Inoltre, gli spazi dei nomi degli elementi vengono ereditati dall'elemento padre. In altre parole, avrei potuto anche scrivere l'XML sopra come

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

13
+1 buona risposta concettuale utile. Potresti voler qualificare "Fondamentalmente, ogni elemento (o attributo) in xml appartiene a uno spazio dei nomi", poiché alcuni elementi e attributi si dice che siano in "nessuno spazio dei nomi". Anche se ho capito che stavi dando le basi.
LarsH,

1
@Rob Levine "Gli attributi possono essere spaziati ma generalmente non lo sono." Che dire di Android?
Paul Brewczynski,

1
Quindi, come viene utilizzato ad esempio " your.example.com/xml/person "? Ok ho un tag <person: name>, e adesso? Puoi spiegarlo anche per favore?
Koray Tugay,

1
@WORMSS - Sì - hai ragione. Quando si definisce la query, è necessario specificare lo spazio dei nomi, probabilmente tramite un prefisso. Nel mondo C # System.Xml, ad esempio, dovresti registrare un prefisso con il gestore dello spazio dei nomi utilizzando XmlNamespaceManager.AddNamespace e quindi utilizzare questo prefisso nella tua query. Il fatto che il prefisso non compaia nel documento non ha importanza - solo lo spazio dei nomi che mappa anche.
Rob Levine,

2
Questo collegamento al documento di Microsoft: " msdn.microsoft.com/en-us/library/aa468565.aspx " spiega molto bene lo spazio dei nomi in XML.
Deen John,

16

Penso che la più grande confusione sia che lo spazio dei nomi xml punta a un tipo di URL che non ha alcuna informazione. Ma la verità è che la persona che ha inventato sotto lo spazio dei nomi:

xmlns:android="http://schemas.android.com/apk/res/android"

potrebbe anche chiamarlo così:

xmlns:android="asjkl;fhgaslifujhaslkfjhliuqwhrqwjlrknqwljk.rho;il"

Questo è solo un identificatore univoco. Tuttavia, è stabilito che è necessario inserire un URL univoco che può potenzialmente puntare alla specifica di tag / attributi utilizzati in quello spazio dei nomi. Non è richiesto però.

Perché dovrebbe essere unico? Poiché lo scopo degli spazi dei nomi è di renderli univoci, in modo che l'attributo, ad esempio, denominato sfondo dal proprio spazio dei nomi, possa essere distinto dallo sfondo da un altro spazio dei nomi.

A causa di tale unicità non devi preoccuparti che se crei il tuo attributo personalizzato avrai una collisione di nomi.


Ciao Morfidon. Per favore, potresti aggiungere nella tua risposta un link a un riferimento specificando che il contenuto o l'URL può essere qualsiasi cosa? Cosa deve essere unico? Si prega inoltre di chiarire l'unicità: il nome dello spazio dei nomi XML o il contenuto dell'URL? Saluti
olibre

@olibre Se vuoi usare lo spazio dei nomi di Android dovresti usare il loro nome. Questo è il loro nome unico. Hanno deciso di mettere lì un URL. Se stai creando il tuo spazio dei nomi, puoi chiamarlo come vuoi, assicurandoti che sia unico. Si dice che dovresti usare l'URL che punta al punto in cui descrivi ciò che è all'interno di quello spazio dei nomi, ma come puoi vedere anche i creatori dello spazio dei nomi Android non lo hanno fatto.
Morfidon,

Grazie Morfidon. Ho finalmente capito quel punto mentre leggevo la risposta di Rob . Mi piace la tua risposta perché evidenzia un aspetto importante che non è ben noto. Ma per favore prova a migliorare la tua risposta, chiarisci quale parte deve essere unica, fornisci riferimenti, riformula, controlla il testo ... Alcuni lettori potrebbero essere confusi dalla tua attuale risposta. Saluti
olibre,

1
Questa è la risposta di cui avevo bisogno! Così confuso usare un URI per questo valore di attributo, perché le persone pensano che URI = URL, e si aspettano che alcuni documenti dovrebbero risiedere nella posizione. Ma AFAICT è completamente ok se l'URI restituisce un 404. È solo un identificatore univoco che sembra un indirizzo. Potrebbero esserci alcuni validatori speciali che si aspettano di trovare uno schema o un DTD in quella posizione (il che avrebbe senso), ma penso che questi siano casi speciali. Per favore, correggimi se sbaglio qui.
brennanyoung,

1
@brennanyoung è esattamente come hai detto :)
Morfidon,

12

xmlns - spazio dei nomi xml. È solo un metodo per evitare conflitti di nomi di elementi. Per esempio:

<config xmlns:rnc="URI1" xmlns:bsc="URI2">
  <rnc:node>
      <rnc:rncId>5</rnc:rncId>
  </rnc:node>

  <bsc:node>
      <bsc:cId>5</bsc:cId>
  </bsc:node>
</config>

Due diversi nodeelementi in un file XML. Senza spazi dei nomi questo file non sarebbe valido.


4

Hai spazi dei nomi in modo da poter avere elementi univoci a livello globale. Tuttavia, il 99% delle volte questo non ha molta importanza, ma quando lo metti nella prospettiva di The Semantic Web , inizia a diventare importante.

Ad esempio, è possibile creare un mash-up XML di schemi diversi semplicemente usando l'appropriato xmlns. Ad esempio, schiaccia l'amico di un amico con vCard , ecc.


per xml banale potrebbe essere ignorato, per tutto il resto gli spazi dei nomi sono estremamente importanti. + Non vedo davvero la connessione tra web semantico e spazio dei nomi. Il web semantico è un concetto, lo spazio dei nomi fa parte dello standard XML, si stanno mescolando la definizione dell'interfaccia e i dettagli di implementazione.
Newtopian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.