XML-Binärformat in Java-Anwendungen

Die IBM® Data Server Driver for JDBC and SQLJ kann XML-Daten an den Datenserver senden oder XML-Daten vom Datenserver als binäre XML-Daten abrufen (Daten im Extensible Dynamic Binary XML DB2® Client/Server Binary XML Format ). Der Datenserver muss Unterstützung für binäre XML-Daten bereitstellen.

Die IBM Data Server Driver for JDBC and SQLJ stellt der Anwendung binäre XML-Daten nur über XML-Objektschnittstellen zur Verfügung. Dem Benutzer werden die Daten nicht im XML-Binärformat angezeigt.

Das Format der XML-Daten ist für die Anwendung transparent. Die Speicherung und Abfrage von binären XML-Daten erfordert Version 4.9 oder höher des IBM Data Server Driver for JDBC and SQLJ. Wenn Sie in SQLJ-Anwendungen mit XML-Binärdaten arbeiten, ist ebenfalls das Paket 'sqlj4.zip' der Version 4.9 oder höher erforderlich.

Mit der Eigenschaft 'xmlFormat' steuern Sie, ob als Datenformat zum Abrufen von XML-Daten XML-Textformat oder XML-Binärformat verwendet wird. Der Wert XML_FORMAT_BINARY (1) für 'xmlFormat' aktiviert das XML-Binärformat. Der Standardwert ist XML-Textformat.

Bei der Aktualisierung von Daten in XML-Tabellenspalten hat 'xmlFormat' keine Auswirkungen. Wenn es sich bei den Eingabedaten um XML-Binärdaten handelt und der Datenserver keine XML-Binärdaten unterstützt, werden die Eingabedaten in XML-Textdaten konvertiert. Andernfalls findet keine Konvertierung statt.

Wenn binäre XML-Daten verwendet werden, dürfen die an die IBM Data Server Driver for JDBC and SQLJ übergebenen XML-Daten dürfen sich nicht auf externe Entitäten, interne Entitäten oder interne DTDs beziehen. Externe DTDs werden nur unterstützt, wenn sie zuvor in der Datenquelle registriert wurden.

Auf der Connection -Schnittstelle ist keine setXXX -Methode für die xmlFormat -Eigenschaft definiert. Um den Wert xmlFormat festzulegen, wenn Sie die Schnittstelle Connection verwenden, müssen Sie daher xmlFormat als Eigenschaft angeben, wenn Sie die Methode DriverManager.getConnection ausführen. Beispiel:

properties.put("xmlFormat", "1");
DriverManager.getConnection(url, properties);
Einschränkung : Wenn Sie XML-Daten im Binärformat an einen Db2 for z/OS® datenserver senden, der binäre XML-Daten unterstützt, können Sie kein InputStreamReader -Objekt mit einem Charset -Objekt namens UTF-16LE, UTF-8 oder UTF-16BE für eine XML-Dokumentdatei verwenden, die eine Byte Order Mark (BOM) enthält. Um diese Einschränkung zu umgehen, führen Sie eine der folgenden Aktionen aus:
  • Entfernen Sie die BOM aus dem XML-Instanzdokument in der Eingabedatei.
  • Verwenden Sie ein InputStreamReader -Objekt mit einem Charset -Objekt namens UTF-16 für die Eingabedatei.
  • Verwenden Sie für die Eingabedatei ein InputStream -Objekt anstelle eines InputStreamReader -Objekts.

Das XML-Binärformat ist am effizientesten für Fälle, in denen die Ein- oder Ausgabedaten nichttextuell dargestellt werden, z. B. als SAX, StAX oder DOM. Mit den folgenden Methoden beispielsweise werden XML-Daten abgerufen, die nichttextuell dargestellt werden:

  • getSource(SAXSource.class)
  • getSource(StAXSource.class)
  • getSource(DOMSource.class)

Mit diesen Methoden werden XML-Spalten mit Daten aktualisiert, die nichttextuell dargestellt werden:

  • setResult(SAXResult.class)
  • setResult(StAXResult.class)
  • setResult(DOMResult.class)

Die SAX-Darstellung ist die effizienteste Methode zum Abrufen von Daten, die das XML-Binärformat aufweisen, da die Daten nicht extra aus dem Binär- in das Textformat konvertiert werden müssen.

Angenommen, Sie setzen 'xmlFormat' auf XML_FORMAT_BINARY (1). Im folgenden Beispiel von JDBC IBM Data Server Driver for JDBC and SQLJ werden Daten im binären XML-Format abgerufen. Die Anwendung verwendet den SAX-Parser, um die abgerufenen Daten zu analysieren.
…
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT XMLCOL FROM XMLTABLE");
ContentHandler handler = new MyContentHandler();
while (rs.next()) {
	SQLXML sqlxml = rs.getSQLXML(1);				
	SAXSource source = sqlxml.getSource(SAXSource.class);
	XMLReader reader = source.getXMLReader();
	reader.setContentHandler(handler);
	reader.parse(source.getInputSource());
}
…

Mit dem folgenden SQLJ-Beispiel werden dieselben Aktionen ausgeführt.

#sql iterator  SqlXmlIter(java.sql.SQLXML);
{
 …
 SqlXmlIter SQLXMLiter = null;
 java.sql.SQLXML outSqlXml = null;
 ContentHandler handler = new MyContentHandler();
 #sql [ctx] SQLXmlIter = {SELECT XMLCOL FROM XMLTABLE};
 #sql {FETCH :SqlXmlIter INTO :outSqlXml}; 
 while (!SQLXMLIter.endFetch()) {
  SAXSource source = outSqlXml.getSource(SAXSource.class);
  XMLReader reader = source.getXMLReader();
  reader.setContentHandler(handler);
  reader.parse(source.getInputSource());
  #sql {FETCH :SqlXmlIter INTO :outSqlXml};
 }
 …
}