Serializzazione XML

La serializzazione XML è il processo di conversione dei dati XML dalla loro rappresentazione interna in una tabella di tipo Db2 e al formato testuale XML che hanno in un'applicazione.

È possibile invocare la funzione XMLSERIALIZE per richiedere al server di database Db2 di eseguire la serializzazione XML prima di inviare i dati XML all'applicazione client. Questo processo è chiamato serializzazione esplicita. In alternativa, è possibile omettere la chiamata XMLSERIALIZE e recuperare i dati da una colonna XML direttamente nelle variabili dell'applicazione. Il server di database Db2 serializza i dati XML durante il recupero. Questo processo è chiamato serializzazione implicita.

Con la serializzazione implicita, i dati hanno il tipo XML quando vengono inviati al client, se il client supporta il tipo di dati XML. Per le applicazioni Db2 , ODBC e embedded SQL, il server di database Db2 aggiunge ai dati una dichiarazione XML, con la specifica di codifica appropriata. Per le applicazioni Java™, il server di database Db2 non aggiunge una dichiarazione XML, a meno che non si utilizzino i metodi obsoleti DB2Xml.getDB2Xmlxxx per recuperare i dati.

La serializzazione implicita è il metodo preferito nella maggior parte dei casi. L'invio di dati XML al client consente al client dell' Db2 e di gestire correttamente i dati XML. La serializzazione esplicita richiede un'ulteriore gestione da parte del cliente.

È possibile recuperare i dati XML nel formato binario XML (Extensible Dynamic Binary XML Db2 Client/Server Binary XML Format), anziché come dati XML testuali, per evitare la serializzazione. Il recupero dei dati in formato binario XML è supportato solo nelle applicazioni JDBC, SQLJ o ODBC, oppure dall'utility UNLOAD.

Dopo un invocazione esplicita di XMLSERIALIZE, i dati hanno un tipo di dati non XML nel server del database e vengono inviati al client come tale tipo di dati.

XMLSERIALIZE consente di specificare:
  • Il tipo di dati SQL a cui i dati vengono convertiti quando vengono serializzati

    Il tipo di dati è un tipo di dati CLOB, BLOB, DBCLOB.

  • Se i dati di output devono includere la seguente dichiarazione XML esplicita (ESCLUDENDO XMLDECLARATION o INCLUDENDO XMLDECLARATION):
    <?xml version="1.0" encoding="UTF-8"?>
L'output di XMLSERIALIZE è costituito da dati Unicode UTF-8-encoded.

Assicurati di aver compreso le implicazioni della richiesta di una specifica di codifica esplicita quando esegui XMLSERIALIZE. Se si recuperano i dati testuali XML in un tipo di dati non binario, i dati vengono convertiti nella codifica dell'applicazione, ma la specifica di codifica non viene modificata. Pertanto, la codifica dei dati potrebbe non essere conforme alle specifiche di codifica. Questa situazione si traduce in dati XML che non possono essere analizzati dai processi applicativi che si basano sul nome della codifica.

In generale, è preferibile la serializzazione implicita. Tuttavia, nelle seguenti circostanze, è meglio eseguire un XMLSERIALIZE esplicito:
  • Quando i documenti XML sono molto grandi

    Poiché non esistono localizzatori XML, se i documenti XML sono molto grandi, è possibile utilizzare XMLSERIALIZE per convertire i dati in un tipo LOB in modo da poter utilizzare i localizzatori LOB.

  • Quando il cliente non supporta i dati XML

    Se il client è una versione precedente che non supporta il tipo di dati XML e si utilizza la serializzazione XML implicita, il server di database Db2 converte i dati nel tipo di dati BLOB. Se si desidera che i dati recuperati siano di un altro tipo, è possibile eseguire dinamicamente un'istruzione SQL che richiama XMLSERIALIZE per specificare l'output CLOB o DBCLOB.

  • Quando si desidera passare dati XML a una stored procedure o a una funzione definita dall'utente

    Db2 for z/OS® le procedure memorizzate e le funzioni definite dall'utente non supportano i parametri con il tipo di dati XML. Pertanto, se si desidera passare i dati da una colonna XML a una routine, è necessario richiamare XMLSERIALIZE sui dati per convertirli in un tipo BLOB, CLOB o DBCLOB.

Il miglior tipo di dati per convertire i dati XML è il tipo di dati BLOB, perché il recupero dei dati binari comporta meno problemi di codifica.

Esempio : la colonna XML Info nella tabella di esempio Customer contiene un documento che contiene l'equivalente gerarchico dei seguenti dati:
<customerinfo xml:space="default" xmlns="http://posample.org" Cid='1000'>
  <name>Kathy Smith</name>
  <addr country='Canada'>
  <street>5 Rosewood</street>
  <city>Toronto</city>
  <prov-state>Ontario</prov-state>
  <pcode-zip>M6W 1E6</pcode-zip>
  </addr>
  <phone type='work'>416-555-1358</phone>
</customerinfo>
Richiama XMLSERIALIZE per serializzare i dati e convertirli in un tipo BLOB prima di recuperarli in una variabile host.
SELECT XMLSERIALIZE(Info as BLOB(1M)) from Customer
  WHERE CID='1000'
Esempio : in un programma C, recuperare il documento informativo del cliente per l'ID cliente 1000 in un XML come variabile host BLOB. In questo modo si ottiene una serializzazione XML implicita. I dati recuperati sono nello schema di codifica " UTF-8 " e contengono una dichiarazione XML.
EXEC SQL BEGIN DECLARE SECTION;
 SQL TYPE IS XML AS BLOB (1M) xmlCustInfo;
EXEC SQL END DECLARE SECTION;
…
EXEC SQL SELECT INFO INTO :xmlCustInfo
  FROM Customer
  WHERE Cid=1000;
Esempio : questo programma in linguaggio di programmazione JDBC, evita la serializzazione XML recuperando i dati nel formato dati binario. Il programma imposta la proprietà DataSource xmlFormat per indicare che i dati devono essere recuperati nel formato binario XML. Quindi il programma recupera il documento di informazioni sul cliente per l'ID cliente 1000 in un oggetto SQLXML. Successivamente, il programma recupera i dati dall'oggetto SQLXML in un oggetto DOMSource , in modo che i dati recuperati siano in una rappresentazione non testuale. Questa tecnica richiede l'utilizzo di JDBC 4.0 o versioni successive.
import java.sql.*;                        // JDBC base
import com.ibm.db2.jcc.*;                 // IBM Data Server Driver for JDBC
                                          // and SQLJ implementation of JDBC
…
com.ibm.db2.jcc.DB2SimpleDataSource db2ds =  
  new com.ibm.db2.jcc.DB2SimpleDataSource();
                                          // Create the DataSource object
db2ds.setDriverType(4);                   // Set the driver type
db2ds.setDatabaseName("san_jose");        // Set the location
db2ds.setUser("db2adm");                  // Set the user
db2ds.setPassword("db2adm");              // Set the password
db2ds.setServerName("mvs1.sj.ibm.com");  
                                          // Set the server name
db2ds.setPortNumber(5021);                // Set the port number
db2ds.setXMLFormat(
  com.ibm.db2.jcc.DB2BaseDataSource.XML_FORMAT_BINARY);
                                          // Set XML format to binary
…
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT INFO FROM Customer WHERE Cid='1000'");
SQLXML sqlxml = rs.getSQLXML(1);
DOMSource domSource = sqlxml.getSource(DOMSource.class); 
                                         // Get a DOMSource object from 
                                         // the SQLXML object, to avoid
                                         // XML serialization
Document document = (Document) domSource.getNode();