ヘッダーをスキップ
Oracle® XML Developer's Kitプログラマーズ・ガイド
11gリリース2 (11.2)
B56264-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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のうち、いずれかでアクセス可能なオブジェクト・ツリーを構築します。

  • DOM: ツリーベースAPI。ツリーベースAPIは、XML文書を内部ツリー構造にコンパイルします。これによって、アプリケーションは、XMLおよびHTML文書用のツリーベースの標準APIであるDocument Object Model (DOM)を使用してツリー内をナビゲートできます。

  • SAX: イベントベースAPI。イベントベースAPIは、ユーザー定義のSAXイベント・ハンドラを使用して、要素の開始や終了などの解析イベントをアプリケーションに直接通知します。通常は、内部ツリーを構築しません。アプリケーションは、ハンドラを実装して様々なイベントを処理します。これは、GUIによるイベント処理に類似しています。

ツリーベース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データ型

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

DATATYPE 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実装オブジェクトにアタッチされます。1つのDOM実装オブジェクトに複数のDOMツリーをアタッチできます。各DOMツリーを削除および割当て解除するには、ドキュメント・オブジェクトを削除します。特定のDOM実装オブジェクトが削除されると、そのオブジェクトにアタッチされているDOMツリーはすべて削除されます。DOMImplementationオブジェクトがユーザーに直接表示されることはありません。これは、クラスDOMImplRefを介して表示されます。これは、マルチスレッド環境の要件であるため必須です。

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

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

DOM TraversalおよびRangeデータ型

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

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

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

DATATYPE 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++のデフォルト動作は、次のとおりです。

  • キャラクタ・セットのエンコーディングはUTF-8です。ドキュメントがすべてASCII形式である場合は、パフォーマンスを向上するために、エンコーディングをUS-ASCIIに設定することをお薦めします。

  • メッセージは、msghdlrが指定されていないかぎり、stderrに出力されます。

  • XML Parser for C++は、XML文書が整形式であるか、またはDTDに対して妥当であるかどうか(オプション)を確認します。XML Parser for Cは、DOMインタフェースを介してアクセス可能なオブジェクト・ツリーを構築するか、SAXインタフェースを介して順次操作します。

  • saxcbがSAXコールバックAPIを使用するように設定すると、DOM APIがアクセスできる解析ツリーは構築されません。不要なSAXコールバック関数は、すべてNULLに設定できることに注意してください。

  • パーサーは、デフォルト動作では、入力が整形式であることは確認しますが、妥当であるかどうかは確認しません。フラグXML_FLAG_VALIDATEを設定することで、入力の妥当性を検証できます。空白処理のデフォルト動作は、XML 1.0仕様に完全に準拠しています。すべての空白は、無視できる空白が明示された状態でアプリケーションに通知されます。ただし、アプリケーションによっては、XML_FLAG_DISCARD_WHITESPACEを設定し、要素の終了タグと次の要素の開始タグの間のすべての空白を削除する方が適切な場合もあります。


    注意:

    シングルバイト・キャラクタ・セット(US-ASCII、ISO 8859キャラクタ・セットのいずれかなど)のみを使用している場合、明示的にデフォルトのエンコーディングを設定することをお薦めします。UTF-8などのマルチバイト・キャラクタ・セットを使用した場合より、パフォーマンスが25%向上します。

  • どちらの場合も、イベントベースAPIは、XML文書に対してより単純で低レベルのアクセスを提供します。したがって、使用可能なシステム・メモリーよりサイズの大きい文書を解析し、コールバック・イベント・ハンドラを使用して独自のデータ構造を構築できます。

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リファレンス』を参照してください。