Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipo XML
PrecedenteTipo UUIDArraySuccessivo

8.13. Tipo XML

Il tipo di dato xml può essere usato per memorizzare dati XML. Il suo vantaggio, rispetto alla memorizzazazione di dati XML in un campo text, è che esso controlla che i valori in input abbiano una buona formattazione, e ci sono funzioni di supporto per realizzare con esso operazioni di tipo sicuro; Vedere Sezione 9.14, «Funzioni XML». L'utilizzo di questo tipo di dato richiede che l'installazione sia stata compilata con configure --with-libxml.

[Nota]

Nota

Nota per il revisore: da rivedere!!!

Il tipo xml può memorizzare «documenti» ben formattati, come definito dallo standard XML, come pure una parte di frammenti di «contenuto», come sono definiti dalla XMLDecl? content nello standard XML. Approssimativamente, questo significa che i frammenti di contenuto possono avere più di un elemento di alto livello o nodi di carattere. L'espressione xmlvalue IS DOCUMENT può essere usata per valutare se un particolare valore di xml è un documento completo o solo una parte del contenuto.

8.13.1. Creare valori XML

Per produrre un valore di tipo xml da dati carattere, utilizzare la funzione xmlparse:

XMLPARSE ( { DOCUMENT | CONTENT } value)

Esempi:

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')

While this is the only way to convert character strings into XML values according to the SQL standard, the PostgreSQL-specific syntaxes: Mentre questo è il solo modo per convertire stringhe di caratteri in valori XML secondo la standard SQL, anche le specifiche sintassi di PostgreSQL:

xml '<foo>bar</foo>'
'<foo>bar</foo>'::xml

possono essere usate.

Il tipo xml non valida i valori in input secondo una dichiarazione di tipo di documento (DTD),, anche quando il valore di input specifica un DTD. Attualmente non c'è un supporto incluso per la validazione in base ad altri linguaggi tipo XML Schema.

L'operazione inversa, la produzione di un valore di tipo stringa di caratteri da un xml, utilizza la funzione xmlserialize:

XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type )

Il parametro type può essere del tipo character, character varying, o text (o un nome alias per essi). Inoltre, secondo lo standard SQL, questo è il solo modo per effettuare la conversione tra un tipo xml e i tipi carattere, ma PostgreSQL consente anche di effettuare semplicemente una conversione al valore.

When a character string value is cast to or from type xml without going through XMLPARSE or XMLSERIALIZE, respectively, the choice of DOCUMENT versus CONTENT is determined by the «XML option» session configuration parameter, which can be set using the standard command: Quando un valore stringa di caratteri viene convertito ad, o da, un tipo xml senza passare da XMLPARSE o XMLSERIALIZE, rispettivamente, la scelta di DOCUMENT rispetto a CONTENT è determinata dall'«opzione XML» del parametro di configurazione di sessione , che può essere impostato usando il comando standard

SET XML OPTION { DOCUMENT | CONTENT };

o la sintassi più vicina a PostgreSQL:

SET xmloption TO { DOCUMENT | CONTENT };

Il valore predefinito è CONTENT, per cui tutte le forme di dati XML sono consentite.

[Nota]

Nota

Con il valore di default dell'opzione XML, non è possibile convertire direttamente stringhe di caratteri al tipo xml se contengono una dichiarazione di tipo di documento, perchè la definizione di frammenti di contenuto XML non le accetta. Se si ha bisogno di farlo, usare XMLPARSE o cambiare l'opzione XML.

8.13.2. Gestire la codifica

Bisogna avere molta cura quando ci si occupa di codifiche multiple di caratteri nel client, nel server e nei dati XML passati tramite essi. Quando si utilizza il modo testo per passare query al server e i risultati delle query al client (che è il modo normale), PostgreSQL converte tutti i dati carattere, passati tra il client ed il server e viceversa, alla codifica di caratteri della rispettiva fine; vedere Sezione 22.2, «Character Set Support». Questo comprende rappresentazioni stringa di valori XML, come negli esempi precedenti. Questo normalmente significherebbe che dichiarazioni di codifica contenute dentro dati XML potrebbero diventare non valide quando i dati carattere vengono convertiti ad altre codifiche mentre viaggiano tra il client ed il server, mentre la dichiarazione di codifica incorporata non è stata cambiata. Per far fronte a questo tipo di comportamento, una dichiarazione di codifica contenuta in una stringa di caratteri in input ad un tipo xml viene ignorata, e si assume che il suo contenuto sia nell'attuale codifica del server. Di conseguenza, per una corretta elaborazione, tali stringhe di caratteri di dati XML dovranno essere mandate dal client nella codifica corrente del client. È responsabilità del client, o di convertire il documento alla codifica corrente del server prima di inviarlo al server, oppure modificare opportunamente la codifica del client. In output, i valori di tipo xml non dovranno avere una dichiarazione di codifica, e i client dovranno assumere che il dato sia nella corrente codifica del client.

Quando si utilizza il modo binario per passare parametri delle query al server e risultati delle query indietro al client, nessuna conversione viene effettuata per il set di caratteri, per cui la situazione è differente. In questo caso, una dichiarazione di codifica nei dati XML sarà osservata, ed in sua assenza, il dato verrà assunto essere in UTF-8 (come richiesto dallo standard XML; notare che PostgreSQL non supporta UTF-16 per niente). In output, i dati dovranno avere una dichiarazione di codifica che specifica la codifica del client, a meno che la codifica del client non sia UTF-8, in quel caso essa può essere omessa.

Come è logico, l'elaborazione di dati XML con PostgreSQL sarà meno soggetta a errori e più efficiente se la codifica dei dati XML, la codifica del client e la codifica del server sono le stesse. Poichè i dati XML sono internamente elaborati in UTF-8, i calcoli saranno più efficienti se anche la codifica del server è UTF-8.

[Attenzione]

Attenzione

Qualche funzione relativa all'XML potrebbe non funzionare su dati non ASCII quando la codifica del server non è UTF-8. Questo è un problema noto per xpath() in particolare.

8.13.3. Accedere ai valori XML

Il tipo dato xml è insolito in quanto non fornisce nessun operatore di confronto. Questo perchè non c'è un algoritmo di comparazione ben definito ed universalmente utilizzato per i dati XML. Una conseguenza di questo è che non possono essere richiamate righe confrontando una colonna xml con un valore di ricerca. I valori XML dovranno quindi essere normalmente accompagnati da un campo chiave separato tipo un ID. Una soluzione alternativa per confrontare valori XML è di convertirli prima in stringhe di caratteri, ma si noti che i confronti di stringhe di caratteri hanno poco a che fare con un metodo di confronto XML utile.

Poichè non ci sono operatori di confronto per il tipo dato xml, non è possibile creare un indice direttamente su una colonna di questo tipo. Se si desidera una ricerca veloce nei dati XML, una possibile soluzione può essere la conversione ad un tipo stringa di caratteri e indicizzarla, o indicizzare un'espressione XPath. La query effettiva dovrebbe naturalmente essere adeguata per la ricerca di espressioni indicizzate.

La funzionalità ricerca di testo in PostgreSQL può anche essere usata per velocizzare ricerche di documenti completi di dati XML. Il necessario supporto di pre-elaborazione, però, non è ancora disponibile nella distribuzione PostgreSQL.

Documentazione di PostgreSQL 9.0 > Il linguaggio SQL > Tipi di Dato > Tipo XML
PrecedenteTipo UUIDArraySuccessivo