A cosa servono i namespace XML?

Questo è qualcosa che trovo sempre un po ‘difficile da spiegare agli altri: perché esistono spazi dei nomi XML? Quando dovremmo usarli e quando non dovremmo? Quali sono le più comuni insidie ​​quando si lavora con gli spazi dei nomi in XML?

Inoltre, come si relazionano agli schemi XML? Gli schemi XSD dovrebbero sempre essere associati a uno spazio dei nomi?

Servono a consentire l’unione di più linguaggi di markup, senza doversi preoccupare dei conflitti di nomi di elementi e attributi.

Ad esempio, guarda un po ‘di codice XSLT, e poi pensa cosa succederebbe se non usassi spazi dei nomi e stavi cercando di scrivere un XSLT in cui l’output dovesse contenere elementi “template”, “for-each”, ecc. . Errori di syntax, è cosa.

Lascerò il consiglio e le insidie ​​agli altri con più esperienza di me.

È quasi come chiedere “perché usiamo i pacchetti per Java / C #?”:

  • riusabilità : puoi riutilizzare un set di tag / attributi che definisci tra diversi tipi di documenti xml.
  • modularità : se devi aggiungere qualche “aspetto” al tuo XML; l’aggiunta di uno spazio dei nomi al documento XML è più semplice rispetto alla modifica dell’intera definizione dello schema xml.
  • Evita di applicare il poluting allo spazio dei nomi “principale” : non forzare il parser a funzionare con una definizione di schema enorme, basta utilizzare lo spazio dei nomi necessario.

Perché esistono spazi dei nomi XML?

Perché, nel 1997, alcune persone molto influenti del W3C li volevano e non volevano prendere una risposta. Anche quando è stato dimostrato, oserei dire in modo conclusivo, che ci sono modi migliori per risolvere il “problema” che pensavano di avere, hanno comunque esercitato la loro influenza per far scrivere i loro desideri in una Raccomandazione del W3C.

Il più grande whopper nella mitologia ormai vasta che circonda XML Namespace è che c’è un merito tecnico per loro. (Questo è l’effetto a valle di una Raccomandazione semplicemente esistente e quindi occupa lo spazio mentale – “Accidenti, ci deve essere una (buona) ragione!” – al contrario di una nota in memoria dimenticabile da qualche parte.)

Molto dolore, nessun guadagno .

Quando dovremmo usarli e quando non dovremmo?

Non dovresti mai usarli se puoi aiutarlo. Sfortunatamente, la promozione incessante di questo dispositivo BAD [*] da parte delle parti interessate ha favorito oggi un clusterf * ck di specifiche che rendono praticamente imansible non dover lottare con gli spazi dei nomi XML in un momento o nell’altro. Quindi, anche se rimuovi te stesso i namespace XML, troverai crud incrostati di spazi di nomi provenienti da tutte le direzioni, o peggio, set di strumenti che semplicemente si rifiutano di funzionare a meno che tu non li alimenti in modo così crudele.

Quali sono le più comuni insidie ​​quando si lavora con gli spazi dei nomi in XML?

Una trappola molto comune è l’uso di espressioni Xpath con documenti in cui uno spazio dei nomi è stato “predefinito”: lo spazio dei nomi dovrà essere esplicito nelle espressioni. Un altro problema li sta usando “correttamente” quando costruiscono documenti: creano problemi dal nulla .

Inoltre, come si relazionano agli schemi XML? Gli schemi XSD dovrebbero sempre essere associati a uno spazio dei nomi?

Non c’è alcuna relazione necessaria, tranne che la specifica dello schema XSD è stata sviluppata in un momento in cui quasi tutti i membri del comitato avevano gli XML Namespaces un po ‘nei loro denti. Così hanno lavorato nel modo più profondo ansible. È ansible, tuttavia, utilizzare gli schemi XSD senza spazi dei nomi, ma è una dura battuta in salita, poiché quasi tutti gli strumenti che supportano gli schemi XSD presuppongono che si “vorrà” utilizzare gli spazi dei nomi.

[*] BAD = Rotto come progettato

AGGIORNAMENTO: un vecchio saggio su questa non soluzione a un non-problema .

La più grande trappola IMHO è interpretare i documenti dell’interazione uomo, ad esempio per sviluppare codice per elaborare un documento XML. È troppo facile concentrarsi sull’espressione letterale del documento piuttosto che sull’infoset risultato dell’analisi del documento.

ad esempio i seguenti nodes

   

sono tutti semanticamente identici – eppure molto diversi dall’occhio ingenuo.

Il primo esempio genera un errore molto comune nello sviluppo di XPaths – manca il fatto che “a” sia in un namespace – quindi // non produce corrispondenze. (o peggio ancora abbinare i nodes in un namespace diverso!)

Il terzo esempio apre un altro difetto nella comprensione: che il testo del prefisso è semanticamente significativo. Durante l’analisi dei documenti con XPATH, posso dichiarare qualsiasi prefisso che mi piace per la corrispondenza, a condizione che corrisponda a quelli del documento.

Pensa a loro come cognomi per i tipi di elementi. Se hai due amici, entrambi chiamano Bob, e stai parlando di uno di loro, qualcuno potrebbe chiedere di quale Bob stai parlando. Il solo dire “Bob” non è molto utile, quindi dici “Bob Smith” o “Bob Jones”.

È lo stesso con i tipi di elementi. A volte un nome breve non è sufficiente, perché persone diverse possono scegliere lo stesso nome. Quindi includi un URI come “cognome”, per distinguere tra i diversi Bob là fuori.

L’XML è un super-linguaggio, il che significa che è la base per qualsiasi linguaggio basato su XML (ha senso, giusto?). Pensa all’XML come a una penna che può scrivere qualsiasi frase, in qualsiasi lingua. Tutto dipende dallo scrittore e preferibilmente la lingua dovrebbe essere nota al lettore.

Un namespace XML è fondamentalmente il nome della lingua, molto simile a “English” o “עברית”. Aiuto il destinatario del documento XML ad analizzarlo ed estrarre le informazioni all’interno.

Diciamo che ho una fabbrica di mobili e tu hai un negozio di mobili. la tua applicazione di archiviazione e la mia domanda di fornitura non sono completamente correlate, ma quando comunicano tramite messaggi XML, i messaggi devono essere comprensibili e facilmente analizzati da entrambe le parti

Pertanto, entrambi i sistemi devono conoscere lo schema , che definisce la syntax del linguaggio e le restrizioni concordate. Pensa allo schema come al dizionario e al libro di testo di grammatica. Lo schema è il documento che entrambi i sistemi dovrebbero conoscere, che chiunque scriva il codice di analisi in ciascun sistema deve saperlo e che include la dichiarazione dello spazio dei nomi.

Ogni spazio dei nomi è denominato URI, che nella maggior parte dei casi è la posizione del documento dello schema che lo definisce.

Ovviamente, non tutti i documenti XML necessitano di uno spazio dei nomi, specialmente quando non viene utilizzato per trasmettere informazioni a un sistema remoto. Ad esempio, quando serializzi gli oggetti in XML per persistere nel tuo database.

Usiamo gli spazi dei nomi perché le persone vogliono usare le stesse parole per significare cose diverse nel proprio idaho privato. Di solito, puoi determinare dal contesto che cosa significa una persona. In un database del personale, l’XML è record del personale. In un database di registro del veicolo, l’XML è record del registro del veicolo.

Entrambi mantengono un tag chiamato “location”, ma il tag significa cose diverse per ognuno e contiene diversi campi.

Ora, è fantastico: ma cosa succede se hai bisogno o vuoi memorizzare XML da entrambi nello stesso database? O, più interessante, che cosa succede se entrambi i database vogliono archiviare blocchi XML da un altro database comune (ad es. Un database di account).

Gli spazi dei nomi XML associano ad ogni tag XML un URI, in modo tale che il nome del tag stesso abbia un url davanti ad esso, che faccia parte del nome del tag (ovviamente, i documenti XML effettivi usano una scorciatoia per fare questo). Scegliendo attentamente l’URI, è facile essere sicuri che i nomi dei tag non entrano in collisione – è come se i due tag di localizzazione fossero nominati in modo completamente diverso, quindi non c’è confusione. Come bonus, i due tag di posizione completamente diversi possono includere elementi dal database degli account e indicare esplicitamente che stanno parlando della stessa cosa.

La cosa che rende tutto questo utile è XPATH.

Con quanto sopra, puoi iniziare a scrivere espressioni XPATH che dicono cose come: trovami qualsiasi accounts:account overdue sezioni di accounts:account overdue ovunque in questo xml. Oppure: trovami qualsiasi accounts:warning message in qualsiasi punto di questo particolare pezzo di XML, in cui il messaggio di avviso è un nodo figlio (comunque profondo) di un personnel:payment nodo di personnel:payment o un vehicle:status nodo di vehicle:status .

Quella espressione XPATH potrebbe essere utilizzata da qualche parte in un documento XSLT, il cui compito è quello di convertire l’XML in XHTML o XPDF, per la visualizzazione.

Qual è il profitto? Perché farlo? Poiché puoi cercare nel file di log XML, estrai tutti i messaggi in ritardo ovunque compaiano, senza confonderli con i tag “message” prodotti da altri sistemi , convertili in xhtml e mostrali in grassetto rosso tramite un tag css: all senza scrivere un frammento di codice procedurale .

Ad esempio: XML Namespaces per esempio

Nelle mie parole: se è necessario utilizzare un formato XML per società esterne (ad esempio) e è necessario fornire nel documento XML alcune informazioni, che hanno lo stesso nome, è necessario uno spazio dei nomi. Esempio:

  

e vuoi unire alcuni dati in questo documento, che ha lo stesso nome, ma un altro senso (quindi valore per), dovresti usare uno spazio dei nomi:

  

Ofcourse: puoi cambiare il nome dell’attributo. Ad esempio “my_unique_color”. Bud in un altro documento, ci può essere attributo con lo stesso nome di nuovo. Pertanto, se si dispone di uno spazio dei nomi univoco (ad esempio il nostro dominio Web), è ansible utilizzare sempre gli stessi nomi di elementi e / o attributi senza problemi.

Dalla raccomandazione W3 …

Gli spazi dei nomi XML forniscono un metodo semplice per qualificare i nomi di elementi e attributi utilizzati nei documenti di Extensible Markup Language associandoli a spazi dei nomi identificati dai riferimenti URI.

I namespace sono usati per disambiguare i nomi che si usano all’interno del documento. Ti dà anche la possibilità di associare un nome breve a uno spazio dei nomi che può quindi essere utilizzato per fare riferimento a un elemento o attributo remoto. Lo spazio dei nomi si riferisce alla posizione che definisce gli elementi e gli attributi che si utilizzano nel documento. C’è molto di più da sapere, ma questo è il cuore di esso. Ci sono molte più informazioni qui .