この章では、統合Java API for XMLTypeの概要を紹介し、Oracle XML DB用とOracle XML Developer's Kit用に統合されたAPIについて説明します。
この章の内容は次のとおりです。
統合Java APIは、Oracle XDKおよびOracle XML DBの両方で必要とされる機能を組み合せたプログラム・インタフェースです。Oracle XML DBは、Javaパッケージoracle.xdb.domを使用してJava DOM APIを実装しており、Oracle XML Developer's Kitはoracle.xml.parser.v2パッケージを使用して実装しています。統合Java APIを使用すると、Oracle XDKとOracle XML DBの両方で必要とされる中核的なDOM APIの統合セットを使用し、また、そのDOM APIに加えて構築されている、新しい機能拡張Javaクラスを活用することができます。
統合Java APIは、XMLデータがどのように格納されているか、つまり、データベース内にあるかデータベース外にあるかに関係なく使用できます。これは、統合Java APIが接続管理のセッション・プール・モデルを使用するためです。接続タイプにthick(OCI APIを使用するCベースの接続)またはthin(JDBC APIを使用するピュアJavaベースの接続)を指定しない場合、データベースの中に格納されていないローカル文書オブジェクトに接続するためにはJava Document Object Model(DOM)APIが使用されます。
|
関連項目: oracle.xml.parser.v2パッケージの詳細は、『Oracle Database XML Java API Reference』を参照してください。 |
thick接続またはthin接続のいずれかのみによってサポートされている一部のコンポーネントは、統合Java APIモデルに統合されました。以前のthin接続によってサポートされていたが、統合されているコンポーネントには、次のものがあります。
DOM Parser
JAXP Transformer
XSU
XSLT
統合Java APIは、古いoracle.xdb.dom Javaクラスにかわる新しいJavaクラスを提供します。oracle.xdb.domパッケージのすべてのクラスは非推奨になりました。古いクラスのいずれかを使用している場合、新しい統合Java APIに移行して、oracle.xml.parser.v2クラスをかわりに使用する必要があります。
表2-1に、Oracle Database 11gリリース1で非推奨となったoracle.xdb.domパッケージ・クラスを示します。
表2-1 非推奨になったXDBパッケージ・クラスと、それと同等の統合Java API
| oracle.xdb.dom.*クラス | oracle.xml.parser.v2(統合Java API)クラス |
|---|---|
|
|
|
|
|
これは非推奨になり、その代替となるクラスはJava DOM API |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
これは非推奨になり、その代替となるクラスはJava DOM API |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
これは非推奨になり、その代替となるクラスはJava DOM API |
|
|
|
|
|
|
Java DOM APIを使用してXMLデータを取得する場合、接続がthinの場合にXMLDocumentインスタンスを取得するか、getDOM()メソッドを使用してXDBDocumentインスタンスを、getDocument()メソッドを使用してXMLDocumentを取得するかのどちらかです。XMLDocumentとXDBDocumentは、どちらもW3C DOMインタフェースのインスタンスです。getDOM()メソッドとXDBDocumentクラスは、統合Java APIでは非推奨になりました。表2-2に、現在のリリースでサポートされている新しいメソッドとクラスを示します。
W3C勧告に加え、統合Java API実装はW3C DOM APIを様々に拡張するいくつかの拡張APIを提供します。データベースへの接続のような基本的な機能や性能の強化を実行する場合は、Oracle固有の拡張APIを使用することができます。
XMLDocumentは、インスタンス化されたXML文書用にDOMを表すクラスです。Document引数を取るXMLTypeコンストラクタを使用して、XML文書からXMLType値を取得できます。
XMLType createXML(Connection conn, Document domdoc)
ノードの手動参照解除のためには、oracle.xml.parser.v2パッケージにあるfreeNode()拡張API(XMLNodeクラス)を使用します。freeNode()を使用する場合、文書フラグメントを明示的にDOMツリーから参照解除します。
XMLDocumentを作成する統合Java APIは、thin文書またはthick文書のいずれかを作成する必要があります。thick文書がデータベースとの通信を確立するには、Connectionオブジェクトが必要です。このため作成APIは、Connectionオブジェクトを受け入れるように拡張されます。
|
注意: Connectionタイプを指定する必要があります。古い文書作成APIは、下位互換性を考慮してまだサポートされています。 |
XMLType.createXML APIの場合、Connectionがオブジェクトおよび他のAPIの型を決定し、明示的に指定されない場合、thin(ピュアJava)オブジェクトが、作成されます。
表2-3に、KINDおよびConnectionプロパティに基づくXMLDocument出力を示します。
表2-3 XMLDocument.KINDおよびXMLDocument.CONNECTIONに基づくXMLDocument出力
| XMLDocument.KIND | XMLDocument.CONNECTION | XMLDocument |
|---|---|---|
|
|
thickまたはKPRB接続 |
thick DOM |
|
|
thinまたは接続なし |
例外 |
|
|
任意の接続タイプ |
thin DOM |
|
未指定 |
任意の接続タイプ |
XMLType以外のAPIthin DOM XMLType.createXML API: 接続タイプにより異なります。つまり、OCIまたはKPRB接続ではthick DOM、thin接続ではthin DOM。 |
統合Java APIモデルでの文書作成用に、次のオブジェクトとメソッドが提供されています。
DOMParserオブジェクトおよびparse()メソッド: DOMParserオブジェクトおよびparse()メソッドを使用してXML文書を解析します。オブジェクトの型(thickまたはthin)を指定する必要があります。thickオブジェクトでは、DOMParser.setAttribute() APIを使用してConnectionプロパティを指定する必要もあります。次に例を示します。
DOMParser parser = new oracle.xml.parser.v2.DOMParser(); parser.setAttribute(XMLDocument.KIND, XMLDocument.THICK); parser.setAttribute(XMLDocument.CONNECTION, conn);
DocumentBuilderオブジェクト: Java固有のAPIであるJAXPを使用してXML文書を解析するにはDocumentBuilderオブジェクトを使用します。DocumentBuilderFactoryクラスでDOMパーサー・ファクトリを作成する必要があります。DocumentBuilderFactoryクラスは使用されるDOMParserへの接続を渡し、DOMParserがこれらのAPIから文書を作成します。
DocumentBuilderは入力SAXイベントからDOMを構築します。この場合、DocumentBuilderFactory上に設定されたプロパティからConnectionが取得されます。次に例を示します。
DocumentBuilderFactory.setAttribute(XMLDocument.CONNECTION, conn); DocumentBuilderFactory.setAttribute(XMLDocument.KIND,XMLDocument.THICK);
DocumentBuilderFactoryクラスは、次のAPIから文書を作成するために使用されるDOMParserへの接続を渡します。
DocumentBuilder.newDocument() DocumentBuilder parse(InputStream) DocumentBuilder parse(InputStream, int) DocumentBuilder.parse(InputSource)
XSU: このメソッドはXMLDocumentをユーザーに戻します。必要なオブジェクトがthickかthinかを指定できます。
OracleXMLUtil util = new OracleXMLUtil(...); util.setAttribute(XMLDocument.KIND, XMLDocument.THICK); util.setAttribute(XMLDocument.CONNECTION, conn); Document doc = util.getXMLDOMFromStruct(struct, enc); OracleXMLQuery query = new OracleXMLQuery(...); query.setAttribute(XMLDocument.KIND, XMLDocument.THICK); query.setAttribute(XMLDocument.CONNECTION, conn); Document doc = query.getXMLDOM (root, meta); OracleXMLDocGenDOM dgd = new OracleXMLDocGenDOM(...); dgd.setAttribute(XMLDocument.KIND, XMLDocument.THICK); dgd.setAttribute(XMLDocument.CONNECTION, conn); Document doc = dgd.getXMLDocumentDOM(struct, enc);
XMLType: getDocument()メソッドを使用すると、必要なオブジェクトがthickかthinかを指定できます。既存のXMLTypeメソッドはすべて、まだ使用可能です。この例では、接続はOPAQUEから推定されます。
XMLType xt = XMLType.createXML(orset.getOPAQUE(1), XMLDocument.THICK); Document doc = xt.getDocument();
ユーザーが型を指定できなくなる既知の事例の1つは、ResultSet.getObject() APIを使用して作成されるXMLTypeの場合です。XMLType列がある表をユーザーが持っていて、ユーザーがその列から選択を行う場合、ユーザーはResultSetに対してgetObject()をコールすることができます。これによりXMLTypeオブジェクトが戻されます。型は列をフェッチするJDBCコールで使用するConnectionによって決定されます。