この章では、統合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によって決定されます。