Java アプリケーションにおけるバイナリー XML 形式
この IBM® Data Server Driver for JDBC and SQLJ XMLデータをデータサーバーに送信したり、バイナリXMLデータ (拡張可能な動的バイナリXML DB2® クライアント/サーバーバイナリXMLフォーマット )としてデータサーバーからXMLデータを取得したりすることができます。 データ・サーバーは、バイナリー XML データをサポートしている必要があります。
IBM Data Server Driver for JDBC and SQLJ XMLオブジェクトインターフェースを通じてのみ、バイナリXMLデータをアプリケーションに提供します。 ユーザーは、バイナリー XML 形式のデータを見ることはありません。
XML データの形式について、アプリケーションが関与する必要はありません。 バイナリXMLデータの保存と取得には、バージョン 4.9 以降の IBM Data Server Driver for JDBC and SQLJ。 SQLJ アプリケーションでバイナリー XML データを使用している場合、 sqlj4.zip パッケージもバージョン 4.9 以降が必要になります。
プロパティー xmlFormat を使用して、XML データを取り出す際のデータ形式がテキストXML かバイナリー XML であるかを制御します。 バイナリー XML 形式を有効にするには、xmlFormat を XML_FORMAT_BINARY (1) に設定します。 デフォルトは、テキスト XML 形式です。
XML 表列のデータのアップデートに関して、xmlFormat が影響することはありません。 入力データがバイナリー XML データであり、データ・サーバーが バイナリー XML データをサポートしていない場合、入力データは テキスト XML データに変換されます。 それ以外の場合、変換は行われません。
バイナリ形式のXMLデータが使用される場合、に渡されるXMLデータは IBM Data Server Driver for JDBC and SQLJ 外部エンティティ、内部エンティティ、または内部DTDを参照することはできません。 外部 DTD は以前にデータ・ソースに登録されている場合にのみサポートされます。
xmlFormat プロパティーの Connection インターフェースに対して setXXX メソッドは定義されていません。 したがって、Connection インターフェースを使用する場合に xmlFormat 値を設定するには、DriverManager.getConnection メソッド実行時に xmlFormat をプロパティーとして指定する必要があります。 以下に例を示します。
properties.put("xmlFormat", "1");
DriverManager.getConnection(url, properties);
- 入力ファイルの XML インスタンス文書から BOM を削除します。
- 入力ファイルに対して、UTF-16 を指定した Charset オブジェクトと共に InputStreamReader オブジェクトを使用します。
- 入力ファイルに対して、InputStreamReader オブジェクトの代わりに InputStream オブジェクトを使用します。
バイナリー XML 形式は、入力データあるいは出力データが SAX、StAX、DOM などの非テキスト表記である場合に最も効率的です。 例えば、以下のメソッドは XML データを非テキスト 表記で取り出します。
- getSource(SAXSource.class)
- getSource(StAXSource.class)
- getSource(DOMSource.class)
以下のメソッドは XML 列を非テキスト表記のデータで更新します。
- setResult(SAXResult.class)
- setResult(StAXResult.class)
- setResult(DOMResult.class)
SAX 表記は、バイナリー形式からテキスト形式へのデータの余分な変換を行わないため、 バイナリー XML 形式のデータを取り出すには 最も効率的な方法です。
…
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());
}
…
次の SQLJ の例も同じ動作を実行します。
#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};
}
…
}