%XML.TextReaderクラスによって、ユーザはドキュメント・モデル内でノードをナビゲートできます。
ノードからノードへの移動に応じて、%XML.TextReaderオブジェクトの各種プロパティは、現在のノー ドに対応する値を取得します。
XML ドキュメントでは、前方への移動しか行うことができず、前に読んだノードに戻ることはできませ ん。
%XML.TextReader クラス
最初に%XML.TextReaderオブジェクトを生成するとき、オブジェクトにはその時点でノードはありま せん。%XML.TextReaderオブジェクトのプロパティが値を取得する前に、(以下で説明するメソッドの 1 つを使用して) 前方のノードに進む必要があります。
6.4.1 次のノードの読み取り
ドキュメント内の次のノードに進むには、Read メソッドを使用します。
While (reader.Read()) { }
Read メソッドは、前方のノードが存在しなくなるまで、真の値を返します。上記のループは、ドキュメ ントの最後に到達するまで実行を継続します。
6.4.2 特定の要素の検索
ReadStartElement メソッドを使用して、ドキュメント内の特定の要素の、次の場所に移動できます。
6.4.3 属性値の読み取り
要素に対する属性名と属性値を検索するには、以下の手順を実行します。
1. 要素ノードに移動します (例えば、Read メソッドを使用します)。
2. MoveToAttributeIndex メソッドでインデックス (要素内の属性の位置) を指定するか、
MoveToAttributeName メソッドで名前を指定して、特定の属性に移動します。
3. %XML.TextReaderオブジェクトのプロパティを使用して、属性の情報を取得します。
4. 現在の要素に対する属性を終了したら、Read などの検索メソッドを実行することで、ドキュメント 内の次の要素に移動できます。また、MoveToElement メソッドを実行して、現在の属性を含む 要素に戻ることもできます。
例えば、以下のコードは、インデックス番号によって、現在のノードに対するすべての属性をリストに します。
If (reader.NodeType = "element") { // list attributes for this node For a = 1:1:reader.AttributeCount { Do reader.MoveToAttributeIndex(a)
Write reader.LocalName," = ",reader.Value,!
} }
以下のコードは、現在のノードに対するcolor属性の値を検索します。
コンテンツの読み取り
If (reader.NodeType = "element") {
// find color attribute for this node If (reader.MoveToAttributeName("color")) { Write "color = ",reader.Value,!
} }
%XML.TextReader クラス
7
SAX インタフェースの使用法
XML オブジェクトのカスタム・インポート・マッピングを作成するには、Caché SAX インタフェースを 使用します。SAX (Simple API for XML) は、イベント駆動型の XML パーサーです。SAX を使用し て、XML ファイルを読み、ファイル内の要素でメソッドを実行できます。Caché には、SAX コンテン ツ・ハンドラ、%XML.SAX.ContentHandlerクラスが備わっています。カスタム XML インポートと処理 メカニズムを作成するには、%XML.SAX.ContentHandlerのサブクラスを生成し、その新規のクラスで 既定のコンテンツ・ハンドラのメソッドをオーバーライドして、必要なアクションを実行します。
以下の図は、この操作の詳細です。
Caché SAX インタフェース
カスタム・インポート・メカニズムを作成し、それを使用するプロセスは以下の通りです。
1. %XML.SAX.ContentHandlerから派生するクラスを生成します。
2. オーバーライドするメソッドを、そのクラスに追加します。
3. %XML.SAX.Parserクラスの ParseFile メソッドを使用して、外部ファイルを読み込むクラス・メソッ ドをそのクラスに追加します。
4. そのクラス・メソッドを実行し、解析するファイルにそのメソッドを渡します。
ファイルの解析時、オーバーライドされたメソッドは定義されたアクションを実行し、コンテンツは適切 に処理されます。