この章の内容は次のとおりです。
注意: 新規のXDKアプリケーションには、xml.hpp にある新規の統合C++ APIを使用してください。oraxml.hpp にある以前のC++ APIは使用できません。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。
|
Oracle XML Parser for C++は、XML文書が整形式であるかどうか、およびDTDまたはXML Schemaに対して妥当であるかどうか(オプション)を確認します。このパーサーは、次の2つのXMLのAPIのうち、いずれかでアクセス可能なオブジェクト・ツリーを構築します。
DOM: ツリーベースAPI。ツリーベースAPIは、XML文書を内部ツリー構造にコンパイルします。これによって、アプリケーションは、XMLおよびHTMLドキュメント用のツリーベースの標準APIである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に対して妥当であるかどうか(オプション)を確認します。このパーサーは、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
ファイルを参照してください。このファイルには、サンプル・プログラムの作成方法が記載されています。
表19-1に、このディレクトリにあるサンプル・ファイルを示します。各ファイル*Main.cpp
には、対応する*Gen.cpp
および*Gen.hpp
があります。
表19-1 XML Parser for C++のサンプル・ファイル
サンプル・ファイル名 | 説明 |
---|---|
DOMSampleMain.cpp |
XML ParserおよびDOMのC++インタフェースの使用例です。 |
FullDOMSampleMain.cpp |
手動でDOMを作成し、実行します。 |
SAXSampleMain.cpp |
SAXSampleプログラムのソースです。 |
関連資料: 『Oracle XML APIリファレンス』 |