ヘッダーをスキップ
Oracle XML Developer's Kitプログラマーズ・ガイド
11gリリース1(11.1)
E05676-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

2 統合Java API for XML

この章では、統合Java API for XMLTypeの概要を紹介し、Oracle XML DB用とOracle XML Developer's Kit用に統合されたAPIについて説明します。

この章の内容は次のとおりです。

統合Java 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接続によってサポートされていたが、統合されているコンポーネントには、次のものがあります。

統合Java APIモデルへの移行

統合Java APIは、古いoracle.xdb.dom Javaクラスにかわる新しいJavaクラスを提供します。oracle.xdb.domパッケージのすべてのクラスは非推奨になりました。古いクラスのいずれかを使用している場合、新しい統合Java APIに移行して、oracle.xml.parser.v2クラスをかわりに使用する必要があります。

XMLTypeクラスのJava DOM API

表2-1に、Oracle Database 11gリリース1で非推奨となったoracle.xdb.domパッケージ・クラスを示します。

表2-1 非推奨になったXDBパッケージ・クラスと、それと同等の統合Java API

oracle.xdb.dom.*クラス oracle.xml.parser.v2(統合Java API)クラス

XDBAttribute

XMLAttr

XDBBinaryDocument

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBCData

XMLCDATA

XDBCharData

CharData

XDBComment

XMLComment

XDBDocFragment

XMLDocumentFragment

XDBDocument

XMLDocument

XDBDocumentType

DTD

XDBDOMException

XMLDomException

XDBDomImplementation

XMLDomImplementation

XDBDOMNotFoundErrException

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBElement

XMLElement

XDBEntity

XMLEntity

XDBEntityReference

XMLEntityReference

XDBNamedNodeMap

XMLAttrList

XDBNode

XMLNode

XDBNotation

XMLNotation

XDBNotImplementedException

これは非推奨になり、その代替となるクラスはJava DOM API XMLTypeクラスにありません。

XDBProcInst

XMLPI

XDBText

XMLText


Java DOM APIを使用してXMLデータを取得する場合、接続がthinの場合にXMLDocumentインスタンスを取得するか、getDOM()メソッドを使用してXDBDocumentインスタンスを、getDocument()メソッドを使用してXMLDocumentを取得するかのどちらかです。XMLDocumentXDBDocumentは、どちらもW3C DOMインタフェースのインスタンスです。getDOM()メソッドとXDBDocumentクラスは、統合Java APIでは非推奨になりました。表2-2に、現在のリリースでサポートされている新しいメソッドとクラスを示します。

表2-2 非推奨になったXMLTypeメソッド

oracle.xdb.XMLTypeの古いAPI oracle.xdb.XMLTypeの新しいAPI

getDOM()

getDocument()

public XMLType createXML(...)

public XMLType createXML(..., int kind)ここでkindXMLDocument.THICKまたはXMLDocument.THIN


拡張API

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ツリーから参照解除します。

文書作成Java API

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

XMLDocument.THICK

thickまたはKPRB接続

thick DOM

XMLDocument.THICK

thinまたは接続なし

例外

XMLDocument.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によって決定されます。