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

戻る
戻る
 
次へ
次へ
 

25 XML Parser for C++の使用

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


注意:

新規のXDKアプリケーションには、xml.hppにある新規の統合C++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされています。

Parser for C++の概要

XML Parser for C++は、XML文書が整形式であるかどうか、およびDTDまたはXMLスキーマに対して妥当であるかどうか(オプション)を確認します。このパーサーは、次の2つのXMLのAPIのうち、いずれかでアクセス可能なオブジェクト・ツリーを構築します。

ツリーベースAPIは広範囲なアプリケーションで有効ですが、特に文書のサイズが大きい場合、より多くのシステム・リソースが消費される場合があります(詳細に制御された環境では、簡単な方法でツリーを構築し、この問題のいくつかを回避できる場合もあります)。さらに、いくつかのアプリケーションではそれぞれ独自のデータ・ツリーを構築する必要があります。この場合、新規のツリーにマップするためにのみ解析ノードのツリーを構築することは、非効率的です。

DOM名前空間

これは、DOMに関連するタイプおよびインタフェースの名前空間です。

DOMインタフェースは、DOM仕様の様々な実装に対する一般的な参照として表されます。DOMインタフェースは、様々な形式での特殊化およびインスタンス化をサポートする、Nodeによってパラメータ化されます。その中で最も重要なものは、現行のCの実装に対応しているxmlnodeです。

これらの一般的な参照には、NULLのような値はありません。これは、実装によって何の状態も持たない(NULLなどの)参照が作成されることはないためです。何の状態も持たないことを通知する必要がある場合は、例外を発生させる必要があります。

DOMツリーが正しく形成されなかった場合は、多数のメソッドによりSYNTAX_ERR例外が発生します。また、不適切なパラメータまたは予想外のNULLポインタの場合は、UNDEFINED_ERRが発生します。これらが特定のメソッドによってのみ発生するエラーである場合は、メソッド署名には反映されません。

実際のDOMツリーはコンテキスト、TCtxには依存しません。ただし、現行のDOMツリーを操作する、xmlctxベースの実装では、現行コンテキストのTCtxにアクセスする必要があります。コンテキスト・ポインタをDOMImplRefのコンストラクタに渡すことによって、この操作を実行できます。マルチスレッド環境では、DOMImplRefは常にスレッド・コンテキストで作成されるため、正しいコンテキストを指すポインタが備わります。

DOMImplRefにより、DOMツリーを作成する方法が提供されます。DomImplRefは、実際のDOMImplementationオブジェクトの参照です。このオブジェクトは、DomImplRefの、コピーではない正規のコンストラクタが起動されると作成されます。この参照は、DOMツリーを共有する必要があるマルチスレッド環境で効率的に動作します。各スレッドには、スレッドに関連する個々のTCtxがあります。これは単一スレッド環境でも同様に動作します。DOMStringは、Oracle実装によってサポートされる唯一のエンコーディングです。その他のエンコーディングは、Oracleの拡張機能でサポートされます。oratext*データ型はすべてのエンコーディングで使用されます。インタフェースは、http://www.w3.org/TR/DOM-Level-2-Core/core.htmlの内容のとおりに、DOMレベル2 Coreインタフェースを表します。これらのC++インタフェースは、DOM仕様をほぼサポートしています。ただし、W3C仕様ではC++バインディングをサポートしていないため、この実装でDOM仕様が完全にサポートされることは保証していません。

DOMデータ型

データ型DomNodeType: DOMノードのタイプを定義します。

データ型DomExceptionCode: DOMのAPIによって戻される例外コードを定義します。

DOMインタフェース

DOMExceptionインタフェース: W3CのDOMのドキュメントの例外DOMExceptionを参照してください。(データが損失した、または実装が不安定であるなどの論理的な理由のいずれかにより)DOM操作を実行できない例外的な状況では、DOMを操作しても例外が発生するのみです。XMLExceptionの機能は、より広範な範囲の例外に使用できます。

NodeRefインタフェース: W3CのドキュメントのインタフェースNodeを参照してください。

DocumentRefインタフェース: W3CのドキュメントのインタフェースDocumentを参照してください。

DocumentFragmentRefインタフェース: W3CのドキュメントのインタフェースDocumentFragmentを参照してください。

ElementRefインタフェース: W3CのドキュメントのインタフェースElementを参照してください。

AttrRefインタフェース: W3CのドキュメントのインタフェースAttrを参照してください。

CharacterDataRefインタフェース: W3CのドキュメントのインタフェースCharacterDataを参照してください。

TextRefインタフェース: W3CのドキュメントのTextノードを参照してください。

CDATASectionRefインタフェース: W3CのドキュメントのCDATASectionノードを参照してください。

CommentRefインタフェース: W3CのドキュメントのCommentノードを参照してください。

ProcessingInstructionRefインタフェース: W3CのドキュメントのPIノードを参照してください。

EntityRefインタフェース: W3CのドキュメントのEntityノードを参照してください。

EntityReferenceRefインタフェース: W3CのドキュメントのEntityReferenceノードを参照してください。

NotationRefインタフェース: W3CのドキュメントのNotationノードを参照してください。

DocumentTypeRefインタフェース: W3CのドキュメントのDTDノードを参照してください。

DOMImplRefインタフェース: W3CのDOMのドキュメントのインタフェースDOMImplementationを参照してください。DOMImplementationは、DOMツリーを操作する際の基本となるインタフェースです。すべてのDOMツリーは、ある特定のDOM実装オブジェクトに付属します。複数のDOMツリーを同じDOM実装オブジェクトに付随させることができます。ドキュメント・オブジェクトを削除すると、各DOMツリーを削除および割当て解除できます。ある特定のDOM実装オブジェクトに付随する全DOMツリーは、このオブジェクトが削除されると削除されます。DOMImplementationオブジェクトは、ユーザーに直接表示することはできません。これは、クラスDOMImpleRefを介して表示できます。これは、マルチスレッド環境の要件であるため必須です。

NodeListRefインタフェース: ノード・リストの抽象的な実装。W3CのドキュメントのインタフェースNodeListを参照してください。

NamedNodeMapRefインタフェース: ノード・マップの抽象的な実装。W3CのドキュメントのインタフェースNamedNodeMapを参照してください。

DOM TraversalおよびRangeデータ型

データ型AcceptNodeCodeでは、ユーザーが提供するノード・フィルタで戻される値、およびイテレータとツリー・ウォーカーに渡される値を定義します。

データ型WhatToShowCodeでは、特定のタイプのノードをフィルタするコードを指定します。

データ型RangeExceptionCodeでは、Rangeインタフェースで発生する可能性がある例外の種類を指定します。

データ型CompareHowCodeでは、2つの範囲で実行できる比較の種類を指定します。

DOM TraversalおよびRangeインタフェース

NodeFilterインタフェース: DOM 2 Node Filterです。

NodeIteratorインタフェース: DOM 2 Node Iteratorです。

TreeWalkerインタフェース: DOM 2 TreeWalkerです。

DocumentTraversalインタフェース: DOM 2インタフェースです。

RangeExceptionインタフェース: DOM 2 Range操作の例外です。

Rangeインタフェース: DOM 2 Rangeです。

DocumentRangeインタフェース: DOM 2インタフェースです。

パーサーの名前空間

DOMParserインタフェース: DOMパーサー・ルート・クラスです。

GParserインタフェース: XMLパーサーのルート・クラスです。

ParserExceptionインタフェース: パーサーおよびバリデータの例外クラスです。

SAXHandlerインタフェース: 現行のSAXハンドラ実装のルート・クラスです。

SAXHandlerRootインタフェース: 全SAXハンドラのルート・クラスです。

SAXParserインタフェース: 全SAXパーサーのルート・クラスです。

SchemaValidatorインタフェース: XML Schemaのバリデータです。

GParserインタフェース

GParserインタフェース: 全XMLパーサー・インタフェースおよび実装のルート・クラスです。これは抽象クラス(インタフェース)ではありません。これは、実在するクラスです。ユーザーはこれを使用して、パーサー・パラメータを設定および確認できます。

DOMParserインタフェース

DOMParserインタフェース: DOMパーサー・ルート抽象クラスまたはインタフェースです。整形式である文書の解析および確認に加えて、DOMParserでは文書がDTDまたはXMLスキーマに対して妥当であるかどうかの検証もできます。

SAXParserインタフェース

SAXParserインタフェース: 全SAXパーサーのルート抽象クラスです。

SAXイベント・ハンドラ

SAXを使用するには、ユーザーがSAXイベント・ハンドラ・クラスを作成し、parse()のコール中にそれをSAXParserに渡すか、またはコール前に設定する必要があります。

SAXHandlerRootインタフェース: 全SAXハンドラのルート・クラスです。

SAXHandlerインタフェース: 現行のSAXハンドラ実装のルート・クラスです。

スレッド・セーフティ

コールの初期化/解析/終了シーケンスの途中でスレッドが分岐している場合、不適切な動作および結果が発生する場合があります。

XML Parser for C++の使用方法

  1. Tools::Factoryをコールしてパーサーを作成すると、解析プロセスが初期化されます。

  2. XML入力は、InputSourceタイプのいずれかになる可能性があります(IO名前空間を参照)。

  3. DOMParserを起動すると、DOMツリーが生成されます。

  4. SAXParserを起動すると、SAXイベントが生成されます。

  5. parserデストラクタをコールすると、プロセスが終了します。

XML Parser for C++のデフォルト動作

XML Parser for C++のデフォルト動作は、次のとおりです。

C++のサンプル・ファイル

xdk/demo/cpp/parser/ディレクトリには、DOMインタフェースおよびSAXインタフェースによるXML Parser for C++の使用方法を示すXMLアプリケーションがあります。

サンプル・ディレクトリ(たとえば、Solarisの$ORACLE_HOME/xdk/demo/cpp)に移動し、READMEファイルを参照してください。このファイルには、サンプル・プログラムの作成方法が記載されています。

表25-1に、このディレクトリにあるサンプル・ファイルを示します。各ファイル*Main.cppには、対応する*Gen.cppおよび*Gen.hppがあります。

表25-1 XML Parser for C++ のサンプル・ファイル

サンプル・ファイル名 説明
DOMSampleMain.cpp

XMLパーサーおよびDOMのC++インタフェースの使用例です。

FullDOMSampleMain.cpp

手動でDOMを作成し、実行します。

SAXSampleMain.cpp

SAXSampleプログラムのソースです。



関連項目:

パーサー・パッケージAPI for C++については、『Oracle Database XML C++ APIリファレンス』を参照してください。