Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Canonical XML

Canonical XML: come scrivere un documento XML in semplice formato testuale
Canonical XML: come scrivere un documento XML in semplice formato testuale
Link copiato negli appunti

XML definisce un insieme di regole per strutturare l'informazione in formato testuale.
Queste regole sono molto libere ed offrono un notevole grado di flessibilità nel senso che la stessa struttura dati o le stesse informazioni possono essere rappresentate in maniera differente.
Consideriamo ad esempio i seguenti documenti XML:

<!--Documento 1-->
<?xml version="1.0"?>
<libri>
  <libro titolo="titolo1" autore="autore1" editore="editore1"/>
  <libro titolo="titolo2" autore="autore2" editore="editore2"/>
</libri>

<!--Documento 2-->
<?xml version="1.0"?>
<libri>
  <libro autore="autore1" editore="editore1" titolo="titolo1"/>
  <libro autore="autore2" editore="editore2" titolo="titolo2"/>
</libri>

Questi due documenti sono logicamente equivalenti visto che rispettano la stessa struttura (definita nel loro Dtd o XML Schema) e contengono gli stessi dati ma non sono uguali. Infatti i due esempi sono fisicamente differenti in quanto sono composti da diverse sequenze di byte.
Nasce quindi il problema di riuscire a capire in maniera automatica quando due file sono equivalenti pur essendo fisicamente differenti.

Per risolvere questo problema è stata ideata la specifica di Canonical XML, che definisce un insieme di regole per scrivere in forma canonica (detta anche simplified -semplificata-) un documento XML.

La forma canonica di un documento XML è una sua rappresentazione fisica che risulta essere invariante rispetto alle possibili differenze sintattiche del documento stesso (ad esempio l'ordine degli attributi, la presenza di spazi bianchi, etc.).

L'operazione che produce un documento in forma canonica è detta Canonicalizzazione (XML Canonicalization) e può essere realizzata in automatico utilizzando un ambiente di sviluppo XML conforme alle specifiche di Canonical XML.

La forma canonica di un file XML è quindi utilizzata per verificare l'equivalenza dei documenti XML: una volta ottenute le forme canoniche, è sufficiente controllare che queste siano fisicamente uguali (cioè composte dalla stessa sequenza di byte) per poter affermare o negare l'equivalenza dei documenti.

Riuscire a stabilire quando due file XML sono equivalenti è molto importante, ad esempio nel campo della sicurezza e dell'autenticazione dei dati e proprio per questo la specifica di Canonical XML è molto usata nell'ambito delle tecnologie XML che si occupano di questi settori (XML Digital Signature e XML Encryption), di cui parleremo nei prossimi capitoli.

Consideriamo il seguente esempio:

<?xml version="1.0"?>
<!DOCTYPE libro [
<!ELEMENT libro (titolo, autore, editore, prezzo, commento)>
<!ATTLIST libro tipo CDATA #REQUIRED
    codice CDATA #REQUIRED>
<!ELEMENT titolo (#PCDATA)>
<!ELEMENT autore (#PCDATA)>
<!ELEMENT editore (#PCDATA)>
<!ELEMENT prezzo (#PCDATA)>
<!ATTLIST prezzo valuta CDATA "euro">
<!ELEMENT commento (#PCDATA)>
]>
<libro xmlns:ns_libro="http://nome-di-un-dominio/ns_libro" tipo='libro "esempio"' codice=" 125961" >
  <ns_libro:titolo >Libro Esempio1</ns_libro:titolo>
  <ns_libro:autore>Autore Esempio1</ns_libro:autore>
  <ns_libro:editore>Editore Esempio1</ns_libro:editore>
  <ns_libro:prezzo>12</ns_libro:prezzo>
  <ns_libro:commento/>
</libri>

Andiamo adesso a descrivere, attraverso questo esempio, quelle che sono le regole principali per ottenere la forma canonica di un documento XML.

Codifica del file

Inizialmente dobbiamo preoccuparci della codifica del documento XML, visto che essendo formato da testo, questo può essere rappresentato seguendo delle codifiche differenti. Un file XML in forma canonica deve essere codificato in formato Unicode (UTF-8).

Inoltre dobbiamo sistemare il carattere che rappresenta la line break (il comando per andare a capo) che normalmente è rappresentato sia da #xD che da #xA. In forma canonica la line break deve essere rappresentato dal simbolo esadecimale #xA.

Attributi

In forma canonica il valore degli attributi deve essere normalizzato, ovvero vanno eliminati gli spazi iniziali e finali e tutti i restanti tipi di spazi (tabulazioni, line breaks, spazi multipli, etc.) vanno convertiti in un singolo spazio rappresentato in esadecimale da #x20. Inoltre non sono ammessi spazi sia prima che dopo il segno di uguaglianza presente nella definizione dell'attributo.

I valori degli attributi devono essere racchiusi tra doppi apici ed eventuali caratteri speciali contenuti al suo interno, devono essere sostituiti con le relative character entities (ad esempio il carattere '"' diventa " , '&' diventa & , etc.).

Gli attributi che hanno un valore di default (nel nostro esempio l'attributo valuta di <prezzo>), devono essere esplicitamente inclusi all'interno dell'elemento del documento in forma canonica.

Gli attributi vanno inseriti all'interno di un elemento in ordine alfabetico, inserendoli dopo l'eventuale dichiarazione di un XML Namespace.

Dopo questo passo il nostro esempio diventa:

<?xml version="1.0"?>
<!DOCTYPE libro [
<!ELEMENT libro (titolo, autore, editore, prezzo, commento)>
<!ATTLIST libro tipo CDATA #REQUIRED
    codice CDATA #REQUIRED>
<!ELEMENT titolo (#PCDATA)>
<!ELEMENT autore (#PCDATA)>
<!ELEMENT editore (#PCDATA)>
<!ELEMENT prezzo (#PCDATA)>
<!ATTLIST prezzo valuta CDATA "euro">
<!ELEMENT commento (#PCDATA)>
]>
<libro xmlns:ns_libro="http://nome-di-un-dominio/ns_libro" codice="125961" tipo="libro "esempio"" >
  <ns_libro:titolo >Libro Esempio1</ns_libro:titolo>
  <ns_libro:autore>Autore Esempio1</ns_libro:autore>
  <ns_libro:editore>Editore Esempio1</ns_libro:editore>
  <ns_libro:prezzo valuta="euro">12</ns_libro:prezzo>
  <ns_libro:commento/>
</libri>

Intestazione del documento

Nella forma canonica non è ammessa la presenza della dichiarazione XML e la definizione dell'eventuale Dtd all'interno del documento XML. Inoltre il primo carattere deve essere '<' e non sono quindi ammesse righe vuote o spazi prima della definizione dell'elemento root del documento XML.

Dopo questo passo l'esempio diventa quindi:

<libro xmlns:ns_libro="http://nome-di-un-dominio/ns_libro" codice="125961" tipo="libro "esempio"" >
  <ns_libro:titolo >Libro Esempio1</ns_libro:titolo>
  <ns_libro:autore>Autore Esempio1</ns_libro:autore>
  <ns_libro:editore>Editore Esempio1</ns_libro:editore>
  <ns_libro:prezzo valuta="euro">12</ns_libro:prezzo>
  <ns_libro:commento/>
</libri>

Elementi

Anche gli elementi devono essere normalizzati, per ottenere la forma canonica XML.

Non sono ammessi spazi tra la parentesi iniziale ('<') ed il nome del tag e tra lo slash ('/') ed il nome del tag di chiusura.

In caso di presenza di attributi, è consentita la presenza di un unico spazio tra il nome del tag ed il primo attributo e tra gli attributi successivi.

Inoltre non è ammesso uno spazio tra l'ultimo attributo, o in mancanza di attributi, tra il nome del tag e la parentesi angolare finale ('>').

La forma canonica richiede la presenza sia del tag iniziale che del tag finale di ciascun elemento e questo vale anche per gli elementi vuoti.

Applicando anche questi ultimi accorgimenti, possiamo ottenere infine la forma canonica del nostro documento XML d'esempio:

<libro xmlns:ns_libro="http://nome-di-un-dominio/ns_libro" codice="125961" tipo="libro "esempio"">
  <ns_libro:titolo>Libro Esempio1</ns_libro:titolo>
  <ns_libro:autore>Autore Esempio1</ns_libro:autore>
  <ns_libro:editore>Editore Esempio1</ns_libro:editore>
  <ns_libro:prezzo valuta="euro">12</ns_libro:prezzo>
  <ns_libro:commento></ns_libro:commento>
</libri>


Ti consigliamo anche