この章の内容は次のとおりです。
|
注意: 新規のXDKアプリケーションには、xml.hppにある新規の統合C++ APIを使用してください。oraxml.hppにある以前のC++ APIは非推奨です。下位互換性のみを目的としてサポートされています。 |
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インタフェースは、様々な形式での特殊化およびインスタンス化をサポートする、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仕様が完全にサポートされることは保証していません。
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を参照してください。
データ型AcceptNodeCodeでは、ユーザーが提供するノード・フィルタで戻される値、およびイテレータとツリー・ウォーカーに渡される値を定義します。
データ型WhatToShowCodeでは、特定のタイプのノードをフィルタするコードを指定します。
データ型RangeExceptionCodeでは、Rangeインタフェースで発生する可能性がある例外の種類を指定します。
データ型CompareHowCodeでは、2つの範囲で実行できる比較の種類を指定します。
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インタフェース: 全XMLパーサー・インタフェースおよび実装のルート・クラスです。これは抽象クラス(インタフェース)ではありません。これは、実在するクラスです。ユーザーはこれを使用して、パーサー・パラメータを設定および確認できます。
コールの初期化/解析/終了シーケンスの途中でスレッドが分岐している場合、不適切な動作および結果が発生する場合があります。
Tools::Factoryをコールしてパーサーを作成すると、解析プロセスが初期化されます。
XML入力は、InputSourceタイプのいずれかになる可能性があります(IO名前空間を参照)。
DOMParserを起動すると、DOMツリーが生成されます。
SAXParserを起動すると、SAXイベントが生成されます。
parserデストラクタをコールすると、プロセスが終了します。
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文書に対してより単純で低レベルのアクセスを提供します。したがって、使用可能なシステム・メモリーよりサイズの大きい文書を解析し、コールバック・イベント・ハンドラを使用して独自のデータ構造を構築できます。
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リファレンス』を参照してください。 |