28 XML Parser for C++の使用
Extensible Markup Language (XML) Parser for C++の使用方法について説明します。
ノート:
Oracle XML Developer's Kit (XDK)アプリケーションには、xml.hpp
に統合されたC++アプリケーション・プログラミング・インタフェース(API)を使用してください。oraxml.hpp
内の非統合の旧C++ APIは非推奨で、下位互換性のためにのみサポートされています。これは、将来のリリースでは削除される予定です。
28.1 Oracle XML Parser for C++の概要
Oracle XML Parser for C++は、XML文書が整形式であるかどうか、およびDocument Type Definition (DTD)またはExtensible Markup Language (XML)スキーマに対して妥当であるかどうか(オプション)を確認します。このパーサーは、次の2つのXMLのAPIのうち、いずれかでアクセス可能なオブジェクト・ツリーを構築します。
-
Document Object Model (DOM): ツリーベースのAPI。ツリーベースAPIは、XML文書を内部ツリー構造にコンパイルします。これによって、アプリケーションは、XMLおよびHTML文書用のツリーベースの標準APIであるDOMを使用してツリー内をナビゲートできます。
-
Simple API for XML (SAX): イベントベースのAPI。イベントベースAPIは、ユーザー定義のSAXイベント・ハンドラを使用して、要素の開始や終了などの解析イベントをアプリケーションに直接通知します。通常は、内部ツリーを構築しません。アプリケーションは、ハンドラを実装して様々なイベントを処理します。これは、GUIによるイベント処理に類似しています。
ツリーベースAPIは広範囲なアプリケーションで有効ですが、特にドキュメントのサイズが大きい場合、より多くのシステム・リソースが消費される場合があります(高度に制御された環境では、簡単な方法でツリーを構築し、この問題のいくつかを回避できる場合もあります)。さらに、いくつかのアプリケーションではそれぞれ独自のデータ・ツリーを構築する必要があります。この場合、新規のツリーにマップするためにのみ解析ノードのツリーを構築することは、非効率的です。
28.2 DOMネームスペース
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実装でサポートされるエンコーディングの1つです。その他のエンコーディングは、Oracleの拡張機能でサポートされます。oratext*
データ型はすべてのエンコーディングに使用されます。インタフェースは、Document Object Model Coreに準拠したDOMレベル2 Coreインタフェースに相当します。これらのC++インタフェースは、DOM仕様をほぼサポートしています。ただし、World Wide Web Consortium (W3C)仕様にはC++バインディングは含まれていないため、この実装で仕様が完全にサポートされることは保証していません。
28.2.2 DOMインタフェース
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を参照してください。
28.2.3 DOM TraversalおよびRangeデータ型
AcceptNodeCode
は、イテレータおよびツリー・ウォーカーで使用される、ノード・フィルタによって戻される値のデータ型です。WhatToShowCode
は、ノードをフィルタ処理するコードのデータ型です。RangeExceptionCode
は、インタフェースRange
によってスローされる可能性のある例外のデータ型です。CompareHowCode
は、範囲比較のデータ型です。
28.3 パーサーの名前空間
パーサーの名前空間に関連付けられたインタフェースについて説明します。
DOMParser
インタフェース—DOMパーサー・ルート・クラスです。
GParser
インタフェース—XMLパーサーのルート・クラスです。
ParserException
インタフェース—パーサーおよびバリデータの例外クラスです。
SAXHandler
インタフェース—現行のSAXハンドラ実装のルート・クラスです。
SAXHandlerRoot
インタフェース—全SAXハンドラのルート・クラスです。
SAXParser
インタフェース—全SAXパーサーのルート・クラスです。
SchemaValidator
インタフェース—XML Schema対応のバリデータです。
28.3.1 GParserインタフェース
インタフェースGParser
は、すべてのXMLパーサー・インタフェースおよび実装のルート・クラスです。これは抽象クラス(つまり、インタフェース)ではありません。これは実在するクラスであり、ユーザーはこれを使用してパーサー・パラメータを設定および確認できます。
28.3.2 DOMParserインタフェース
インタフェースDOMParser
は、DOMパーサー・ルート抽象クラスまたはインタフェースです。文書の解析および整形式であるかどうかの確認に加え、文書がDocument Type Definition (DTD)またはXMLスキーマに対して妥当であるかを検証する方法が提供されます。
28.5 XML Parser for C++の使用方法
Tools::Factory
を起動してパーサーを作成すると、解析プロセスが初期化されます。XML入力は、InputSource
のいずれかの種類にすることができます(「IO
名前空間」を参照)。DOMParser
を起動すると、DOMツリーが生成されます。SAXParser
を起動すると、SAXイベントが生成されます。parser
デストラクタを起動すると、プロセスが終了します。
28.6 XML Parser for C++のデフォルト動作
XML Parser for C++のデフォルト動作について説明します。
-
文字セット・エンコーディングは8ビット・エンコーディングのUnicode (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文書に対してより単純で低レベルのアクセスを提供します。したがって、使用可能なシステム・メモリーよりサイズの大きい文書を解析し、コールバック・イベント・ハンドラを使用して独自のデータ構造を構築できます。
28.7 C++のサンプル・ファイル
ディレクトリxdk/demo/cpp/parser/
には、DOMインタフェースおよびSAXインタフェースによるXML Parser for C++の使用方法を示すXMLアプリケーションがあります。
サンプル・ディレクトリ(たとえば、Solarisの$ORACLE_HOME/xdk/demo/cpp
)に移動し、README
ファイルを参照してください。このドキュメントには、サンプル・プログラムの作成方法が記載されています。
表28-1に、このディレクトリにあるサンプル・ファイルを示します。各ファイル*Main.cpp
には、対応する*Gen.cpp
および*Gen.hpp
があります。
表28-1 XML Parser for C++ のサンプル・ファイル
サンプル・ファイル名 | 説明 |
---|---|
DOMSampleMain.cpp |
XMLパーサーおよびDOMのC++インタフェースの使用例です。 |
FullDOMSampleMain.cpp |
手動でDOMを作成し、実行します。 |
SAXSampleMain.cpp |
SAXSampleプログラムのソースです。 |
関連項目:
パーサー・パッケージAPI for C++については、『Oracle Database XML C++ APIリファレンス』を参照してください