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'è?
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'è?
Risposte:
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/
<LinearLayout
funziona senza prefisso?
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 name
elementi, 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 name
significato 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 personxml
ed mycityxml
entrambi sono mappati allo stesso spazio dei nomi (come nello snippet di seguito), non importa se si antepone un determinato elemento con personxml
o 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>
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.
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 node
elementi in un file XML. Senza spazi dei nomi questo file non sarebbe valido.
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.