(57)【特許請求の範囲】
【請求項１】
コンピュータにツリーの形態で構成されたメッセージを検証させるためのプログラムが記録されたコンピュータ可読記録媒体であって、前記コンピュータに、
深度優先走査順に前記メッセージのツリーを走査して、前記メッセージのツリーの第１の要素を検出する動作と、
第１の検証テーブルを調べて前記第１の要素に対応する第１の代理を特定する動作であって、前記第１の検証テーブルは、前記第１の検証テーブルの中にリストアップされる各要素に関して、所与の要素のサブツリー群が走査されるべきかどうかを示すフラグを含む、動作と、
前記第１の代理を前記第１の要素に適用する動作と、
深度優先走査順に前記メッセージのツリーを走査して、前記第１の要素のサブツリーのルートである第２の要素を検出する動作と、
前記第１の検証テーブルに従って第２の代理を前記第２の要素に適用する動作と、
深度優先走査順に前記メッセージのツリーを走査して、前記第１の要素でも前記第１の要素の下位ノードからなるサブツリーの要素でもない前記メッセージのツリーの第３の要素を検出する動作と、
前記第１の代理が前記第１の要素について、または、前記第２の代理が前記第２の要素について、前記第３の要素に基づき少なくとも１つの判定を行う動作と、
前記第１の要素に対応する前記フラグが、前記第１の要素のサブツリー群が走査されるべきであると示すことを判定する動作と
を実現させるためのプログラムが記録されたことを特徴とするコンピュータ可読記録媒体。
【請求項２】
前記第１の検証テーブルを調べる動作に先立って、第２の検証テーブルが前記第１の要素に対応する代理をまったく含まないと判定する動作をさらに備えたことを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項３】
前記第１の代理を適用する動作は、前記第２の要素を検出する動作に先立って実行され、前記方法は、
前記第２の代理を適用する動作に続いて、前記第１の検証テーブルを調べて前記第１の要素に対応する第３の代理を特定する動作と、
前記第３の代理を前記第１の要素に適用する動作と
をさらに備えたことを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項４】
前記方法は、基準に従って、複数の検証テーブルのなかから前記第１の検証テーブルを選択する動作であって、前記選択される検証テーブルは、適用されるべき代理群を特定するために調べられるテーブルである動作をさらに備えることを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項５】
前記メッセージは、拡張マークアップ言語（ＸＭＬ）の内容を含むことを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項６】
前記第１の代理および前記第２の代理はそれぞれ、解釈可能なコードを含むことを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項７】
前記方法は、前記第１の検証テーブルを含む１つまたは複数の検証テーブルに従った前記メッセージに対する代理群の適用に基づき、前記メッセージが有効であるかどうかを判定する動作をさらに備えたことを特徴とする請求項１に記載のコンピュータ可読記録媒体。
【請求項８】
プログラムされたコンピュータによってメッセージを検証する方法であって、前記コンピュータは、
前記メッセージの特定のタイプの要素を検証するようにそれぞれが適合された１つまたは複数の検証の代理を作成する動作と、
前記メッセージの各タイプの要素に対して前記検証の代理の少なくとも１つを指定する第１の検証テーブルを作成する動作であって、前記第１の検証テーブルは、前記メッセージの中の各タイプの要素に関して、前記タイプの要素のサブツリー群に対する前記検証の代理群が前記サブツリー群に適用されるべきか否かを示すフラグを指定する、動作と、
検証エンジンを前記メッセージに適用する動作であって、前記検証エンジンを用いて、前記メッセージの各要素に関して、前記第１の検証テーブルを調べて前記要素に適用されるべき検証の代理を特定し、前記特定された検証の代理を前記要素に適用する動作と
を実現させるようにプログラムされたことを特徴とする方法。
【請求項９】
前記メッセージの各タイプの要素に対して検証の代理を指定する第２の検証テーブルを作成する動作をさらに備え、
前記検証エンジンは、前記第２の検証テーブルを調べ、所与のタイプの要素に関するエントリが存在する場合、前記第２の検証テーブルによって指定された検証の代理を適用し、存在しない場合、前記第１の検証テーブルによって指定された検証の代理を適用することを特徴とする請求項８に記載の方法。
【請求項１０】
前記第１の検証テーブルは、前記メッセージの各タイプの要素に対する第１の検証の代理および第２の検証の代理を指定し、前記検証エンジンは、前記要素が検出された際、前記第１の検証の代理を前記要素に適用し、前記第１の検証の代理、および前記要素のあらゆるサブツリー群に適用可能な検証の代理群が適用された後、前記第２の検証の代理を前記要素に適用することを特徴とする請求項８に記載の方法。
【請求項１１】
前記メッセージは、拡張マークアップ言語（ＸＭＬ）の内容を含むことを特徴とする請求項８に記載の方法。
【請求項１２】
前記メッセージは、ツリーの形態に構成され、前記メッセージの各要素は、前記ツリーにおけるノードに対応することを特徴とする請求項８に記載の方法。
【請求項１３】
前記検証の代理群のそれぞれは、解釈可能なコードを含むことを特徴とする請求項８に記載の方法。
【請求項１４】
プログラムされたコンピュータによって複数の要素からなるツリーの形態で構成されたメッセージを検証するためのシステムであって、前記コンピュータが、
前記ツリーにおける要素の名前にそれぞれが対応する複数の代理を示す第１の検証テーブルであって、前記メッセージの中の各タイプの要素に関して、前記タイプの要素のサブツリー群に対する前記検証の代理群が前記サブツリー群に適用されるべきか否かを示すフラグを指定する第１の検証テーブルと、
前記ツリーを走査し、前記ツリーの前記走査中に検出された要素の１つである第１の要素に関して、前記第１の検証テーブルを調べて、前記検出された要素に適用されるべき前記複数の代理の１つである第１の代理を特定し、前記第１の代理を呼び出すことによって前記特定された第１の代理を適用し、前記ツリーの前記走査中に検出された前記第１の要素が属するサブツリーのルートである第２の要素に関して、前記第１の検証テーブルを調べて第２の代理を特定し、前記第２の代理を呼び出すことによって前記特定された第２の代理を適用する検証エンジンであって、前記第１の代理が前記第１の要素について、または、前記第２の代理が前記第２の要素について、前記第２の要素でも前記第２の要素の下位ノードからなる前記第１の要素が属するサブツリーの要素でもない前記ツリーの前記走査中に検出された第３の要素に基づき少なくとも１つの判定を行う、検証エンジンと
を実現するようにプログラムされたことを特徴とするシステム。
【請求項１５】
前記ツリーにおける要素の名前にそれぞれが対応する複数の代理を示す第２の検証テーブルをさらに備え、
前記検証エンジンは、前記ツリーの前記走査中に検出された各要素に関して、前記第２の検証テーブルを調べて前記検出された要素に関するエントリが存在するかどうかを判定し、前記第２の検証テーブルの中で前記検出された要素に関するエントリが存在する場合、該エントリを使用し、前記第２の検証テーブルが、前記検出された要素に対応するエントリをまったく含まない場合、前記第１の検証テーブルを調べることを特徴とする請求項１４に記載のシステム。
【請求項１６】
前記第１の検証テーブルは、前記ツリーにおける前記要素群の少なくともいくつかに対するポスト処理の代理を特定し、前記ポスト処理の代理は、前記要素に対する代理、および前記要素のサブツリー群に対する代理群が呼び出された後、呼び出されることを特徴とする請求項１４に記載のシステム。
【請求項１７】
前記メッセージは、拡張マークアップ言語（ＸＭＬ）の内容を含むことを特徴とする請求項１４に記載のシステム。
【請求項１８】
前記代理群のそれぞれは、解釈可能なコードを含むことを特徴とする請求項１４に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、コンピューティングの分野に関し、より具体的には、メッセージ検証のためのシステムおよび方法に関する。
【背景技術】
【０００２】
情報は、一般に、有効な内容と無効な内容の両方を表現することを可能にするだけ十分に豊富な語彙または言語で表される。例えば、ローマ字を使用して正しい英語の文を書くことが可能であるが、いずれの言語の意味規則または構文規則にも従わない英語の語をつなぎ合わせること、または完全に理解できない形で英字をつなぎ合わせることも可能である。コンピュータデータが表現される言語も例外ではない。すなわち、何らかの規則群に従って無効であるコンピュータデータを書くことが可能である。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
コンピュータシステムでは、多くのデータが、拡張マークアップ言語（ＸＭＬ）メッセージの形態のように階層的な形で表現される。ＸＭＬメッセージは、何らかのクラスのメッセージの適切な構文を基本的に定義する何らかのスキーマに適合する。例えば、メッセージのタイプが、「アドレス」である場合があり、アドレスに関するスキーマにより、アドレスが、通りの名前、都市、州、および郵便番号を含むことが要求される場合がある。しかし、スキーマに従うメッセージでさえ、何らかの実質的な理由で無効である可能性がある。例えば、通りの名前、都市、州、および郵便番号であるとされる任意のデータの組合せが、スキーマを満足させるが、例えば、州の要素が米国の州の１つの名前ではない場合、または指定された郵便番号が、都市／州の組合せに合致しない場合、そのアドレスは、やはり無効になり得る。
【０００４】
検証を行う従来のやり方は、力任せの（ｂｒｕｔｅ  ｆｏｒｃｅ）メッセージ特有のコードを介してである。各メッセージクラスに関する検証手続きは、個別に書かれ、クラスコード自体を変更せずに手続きの動作を変更する手段がない。この技術の抱える問題は、検証に関する実質的な要件に対する任意の変更がソースコードに対する変更を要することである。ソースコードに対するそのような変更は、面倒なだけでなく、一部のケースでは、ソースコードを公衆に配布して、検証手続きの消費者が手続きに対するカスタム変更を行うことができるようにすることも要求される可能性がある。ソースコードのそのような配布は、望ましくない場合がある。
【０００５】
以上に鑑みて、従来の技術の欠点を克服するシステムの必要性が存在する。
【０００６】
本発明は、メッセージを検証するための機構を提供する。検証エンジンは、メッセージをウォークスルーする（ｗａｌｋ  ｔｈｒｏｕｇｈ）。例えば、ツリーデータ構造と見なすことができるＸＭＬメッセージの場合、検証エンジンは、深度優先走査順にツリーのノード群をウォークスルーする。
【課題を解決するための手段】
【０００７】
各ノードが見つかった時点で、そのノードを検証する「代理（ｄｅｌｅｇａｔｅ）」を指定するテーブルが調べられる。代理は、検証エンジンが呼び出すことができる名前付きコードユニットである。検証エンジンは、見つかったノードのタイプに対応する代理を呼び出す。次に、検証エンジンは、現在のノードのサブツリー群を走査する。それらのサブツリー群を走査する際、前述した仕方でテーブルが調べられ、代理が呼び出されることが可能である。サブツリーを走査した後、検証エンジンは、テーブルを再び調べ、現在のノードに対するポストハンドラ（ｐｏｓｔ−ｈａｎｄｌｅｒ）代理が存在するか否かを判定する。そのようなポストハンドラが指定されている場合、そのポストハンドラは呼び出される。代理は、何らかの定義済みの検証標準（例えば、組合せが米国における現実のアドレスと実際に一致することを判定することにより、都市、州、および郵便番号の組合せを検証する代理）の下でノードを評価する。
【０００８】
好ましくは、グローバルテーブルとローカルテーブルの両方が存在する。ローカルテーブルは、まず調べられ、現在のノードに対する代理が存在するか否かが判定される。そのような代理が存在する場合、その代理は呼び出される。ローカルテーブルの中でそのような代理が指名されていない場合は、グローバルテーブルを調べて、グローバルテーブルの中で代理が指名されているか否かが判定される。グローバルテーブルの中でそのような代理が指名されている場合、グローバルテーブルからその代理は呼び出される。グローバルテーブルは、広範なカテゴリのメッセージクラスに適用される代理を含むことが可能であり、一方、ローカルテーブルは、特定のメッセージクラスに特有の代理を含むことが可能である。
【０００９】
好ましくは、テーブルは、代理がオプションとして「排他的」と指定されることを可能にする。代理が排他的である場合、ノード、ならびにノードのサブツリー群を検証することを排他的に制御し、したがって、そのサブツリー群は、検証エンジンによって走査されず、そのサブツリー群におけるノード群に関連する代理は、検証エンジンによって適用されない。そうではなく、代理が排他的でない場合、サブツリー群は走査され、サブツリー群におけるノード群に対応する代理は、検証エンジンによって適用される。
【００１０】
本発明のその他の特徴を以下に説明する。  
以上の概要、ならびに好ましい実施形態の以下の詳細な説明は、添付の図面と併せて読むことでよりよく理解される。本発明を例示するため、図面では、本発明の構成例を示しているが、本発明は、開示する特定の方法および手段に限定されない。
【発明を実施するための最良の形態】
【００１１】
（概要）
コンピュータによって使用されるデータ、例えば、何らかのスキーマに準拠するＸＭＬデータは、通常、階層構造にされる。データは、構文としてスキーマに準拠している場合でも、依然、何らかの実質的な規則群の下で無効になり得る。従来、データの集合（メッセージなどの）の実質的な検証を実行することは、特定のクラスのメッセージを検証するように設計された専用コードを要する。本発明は、任意のクラスのメッセージを検証するのに使用することができ、任意の規則群をメッセージに適用するように拡張することができる汎用ツールを提供する。本発明の機構を用いて、検証パラメータおよびデータをＸＭＬ形態で表現することができるあらゆる任意のデータまたはメッセージを検証することができる。
【００１２】
（例示的なコンピューティング環境）
図１は、本発明の態様を実施することができる例示的なコンピューティング環境を示している。コンピューティングシステム環境１００は、適切なコンピューティング環境の一例に過ぎず、本発明の用途または機能の範囲について何ら限定を示唆するものではない。また、コンピューティング環境１００が、例示的な動作環境１００に示したコンポーネントのいずれか１つ、またはいずれかの組合せに関連する依存関係または要件を有すると解釈してはならない。
【００１３】
本発明は、他の多数の汎用または専用のコンピュータシステム環境またはコンピュータシステム構成で機能する。本発明で使用するのに適している可能性がある周知のコンピューティングシステム、コンピューティング環境、および／またはコンピューティング構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルド装置またはラップトップ装置、マルチプロセッサシステム、マイクロプロセッサベースのシステム、セットトップボックス、プログラマブル家庭用電化製品、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、組み込みシステム、以上のシステムまたは装置のいずれかを含む分散コンピューティング環境などが含まれるが、以上には限定されない。
【００１４】
本発明は、コンピュータによって実行されている、プログラムモジュールなどのコンピュータ実行可能命令の一般的な文脈で説明することができる。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。また、本発明は、通信ネットワークまたはその他のデータ伝送媒体を介してリンクされたリモート処理装置によってタスクが実行される分散コンピューティング環境においても実施することができる。分散コンピューティング環境では、プログラムモジュールおよびその他のデータは、メモリ記憶装置を含むローカルコンピュータ記憶媒体とリモートコンピュータ記憶媒体との両方の中に配置することができる。
【００１５】
図１を参照すると、本発明を実施するための例示的なシステムが、コンピュータ１１０の形態で汎用コンピューティング装置を含んでいる。コンピュータ１１０のコンポーネントには、限定ではないが、処理装置１２０、システムメモリ１３０、およびシステムメモリから処理装置１２０までを含む様々なシステムコンポーネントを結合するシステムバス１２１が含まれることが可能である。処理装置１２０は、マルチスレッドプロセッサ上でサポートされるような複数の論理処理装置を表すことが可能である。システムバス１２１は、様々なバスアーキテクチャのいずれかを使用するメモリバスまたはメモリコントローラ、周辺バス、およびローカルバスを含め、いくつかのタイプのバス構造のいずれであってもよい。例として、限定としてではなく、そのようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ）ローカルバス、および（メザニン（Ｍｅｚｚａｎｉｎｅ）バスとしても知られる）ＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔｓ）バスが含まれる。システムバス１２１は、通信装置の間におけるポイントツーポイント接続、スイッチングファブリック、または以上に類するものとして実装してもよい。
【００１６】
コンピュータ１１０は、通常、様々なコンピュータ可読媒体を含む。コンピュータ可読媒体は、コンピュータ１１０がアクセスすることができる任意の利用可能な媒体であることが可能であり、揮発性媒体および不揮発性媒体と、リムーバブルな媒体および固定の媒体とがともに含まれる。例として、限定としてではなく、コンピュータ可読媒体は、コンピュータ記憶媒体および通信媒体を含むことが可能である。コンピュータ記憶媒体には、コンピュータ可読命令、データ構造、プログラムモジュール、またはその他のデータなどの情報を格納するために任意の方法または技術で実装された揮発性媒体および不揮発性媒体と、リムーバブルな媒体および固定の媒体とがともに含まれる。コンピュータ記憶媒体には、限定ではないが、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他のメモリ技術、ＣＤ−ＲＯＭ、デジタルバーサタイルディスク（ＤＶＤ）または他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージまたは他の磁気記憶装置、あるいは所望の情報を格納するのに使用することができ、コンピュータ１１０がアクセスすることができる他の任意の媒体が含まれる。通信媒体は、通常、搬送波などの変調されたデータ信号、または他のトランスポート機構でコンピュータ可読命令、データ構造、プログラムモジュール、またはその他のデータを実体化し、あらゆる情報配信媒体が含まれる。「変調されたデータ信号」という用語は、信号内に情報を符号化するような仕方で特性の１つまたは複数が設定または変更されている信号を意味する。例として、限定としてではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、ならびに音響媒体、ＲＦ媒体、赤外線媒体、およびその他の無線媒体などの無線媒体が含まれる。また、前述した媒体のいずれかの組合せも、コンピュータ可読媒体の範囲に含まれるべきものである。
【００１７】
システムメモリ１３０は、読み取り専用メモリ（ＲＯＭ）１３１やランダムアクセスメモリ（ＲＡＭ）１３２などの揮発性メモリおよび／または不揮発性メモリの形態でコンピュータ記憶媒体を含む。始動中などにコンピュータ１１０内部の要素間で情報を転送するのを助ける基本ルーチンを含む基本入出力システム１３３（ＢＩＯＳ）が、通常、ＲＯＭ１３１の中に格納されている。ＲＡＭ１３２は、通常、処理装置１２０が即時にアクセスすることができ、かつ／または処理装置１２０によって現在、処理されているデータおよび／またはプログラムモジュールを含む。例として、限定としてではなく、図１は、オペレーティングシステム１３４、アプリケーションプログラム１３５、その他のプログラムモジュール１３６、およびプログラムデータ１３７を示している。
【００１８】
コンピュータ１１０は、その他のリムーバブルな／固定の、揮発性／不揮発性のコンピュータ記憶媒体も含むことが可能である。単に例として、図１は、固定の不揮発性の磁気媒体に対して読み取りまたは書き込みを行うハードディスクドライブ１４１、リムーバブルな不揮発性の磁気ディスク１５２に対して読み取りまたは書き込みを行う磁気ディスクドライブ１５１、およびＣＤ−ＲＯＭまたはその他の光媒体などのリムーバブルな不揮発性の光ディスク１５６に対して読み取りまたは書き込みを行う光ディスクドライブ１５５を示している。例示的な動作環境において使用することができるその他のリムーバブルな／固定の、揮発性／不揮発性のコンピュータ記憶媒体には、磁気テープカセット、フラッシュメモリカード、デジタルバーサタイルディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれるが、以上には限定されない。ハードディスクドライブ１４１は、通常、インターフェース１４０のような固定のメモリインターフェースを介してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は、通常、インターフェース１５０のようなリムーバブルなメモリインターフェースでシステムバス１２１に接続される。
【００１９】
前述し、図１に示したドライブ、および関連するコンピュータ記憶媒体により、コンピュータ可読命令、データ構造、プログラムモジュール、およびその他のデータのストレージがコンピュータ１１０に提供される。図１で、例えば、ハードディスクドライブ１４１は、オペレーティングシステム１４４、アプリケーションプログラム１４５、その他のプログラムモジュール１４６、およびプログラムデータ１４７を記憶していることが示されている。以上のコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、その他のプログラムモジュール１３６、およびプログラムデータ１３７と同一であることも、異なることも可能であることに留意されたい。オペレーティングシステム１４４、アプリケーションプログラム１４５、その他のプログラムモジュール１４６、およびプログラムデータ１４７に、ここでは、少なくともそれらが異なるコピーであることを示すために異なる符号を付けている。ユーザは、キーボード１６２、ならびにマウス、トラックボール、またはタッチパッドと一般に呼ばれるポインティング装置１６１などの入力装置を介して、コマンドおよび情報をコンピュータ１１０に入力することができる。その他の入力装置（図示せず）には、マイク、ジョイスティック、ゲームパッド、サテライトディッシュ、スキャナなどが含まれることが可能である。以上の入力装置、およびその他の入力装置は、しばしば、システムバスに結合されたユーザ入力インターフェース１６０を介して処理装置１２０に接続されるが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス（ＵＳＢ）などの他のインターフェースおよびバス構造で接続してもよい。また、モニタ１９１、または他のタイプのディスプレイ装置も、ビデオインターフェース１９０のようなインターフェースを介してシステムバス１２１に接続される。モニタに加えて、コンピュータは、出力周辺インターフェース１９５を介して接続することができるスピーカ１９７やプリンタ１９６などの他の周辺出力装置も含むことが可能である。
【００２０】
コンピュータ１１０は、リモートコンピュータ１８０のような１つまたは複数のリモートコンピュータに対する論理接続を使用するネットワーク化された環境において動作することが可能である。リモートコンピュータ１８０は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピア装置、または他の一般的なネットワークノードであることが可能であり、通常、コンピュータ１１０に関連して前述した要素の多く、またはすべてを含むが、メモリ記憶装置１８１だけを図１に示している。図１に示した論理接続は、ローカルエリアネットワーク（ＬＡＮ）１７１およびワイドエリアネットワーク（ＷＡＮ）１７３を含むが、その他のネットワークを含むことも可能である。そのようなネットワーキング環境は、オフィス、企業全体のコンピュータ網、イントラネット、およびインターネットで一般的である。
【００２１】
ＬＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、ネットワークインターフェースまたはネットワークアダプタ１７０を介してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用される場合、コンピュータ１１０は、通常、インターネットなどのＷＡＮ１７３を介して通信を確立するためのモデム１７２、またはその他の手段を含む。内部にあることも、外部にあることも可能なモデム１７２は、ユーザ入力インターフェース１６０、またはその他の適切な機構を介してシステムバス１２１に接続することができる。ネットワーク化された環境では、コンピュータ１１０に関連して示したプログラムモジュール、またはプログラムモジュールの諸部分は、リモートメモリ記憶装置の中に格納することができる。例として、限定としてではなく、図１は、リモートアプリケーションプログラム１８５が、メモリ装置１８１上に常駐していることを示している。図示したネットワーク接続は、例示的であり、コンピュータ間で通信リンクを確立する他の手段も使用できることが認められよう。
【００２２】
（例示的なＸＭＬデータ）
本発明を使用して、拡張マークアップ言語（ＸＭＬ）の形態のデータのように階層構造になったデータの集合または「メッセージ」を検証することができる。ＸＭＬは、定義済みの構造またはスキーマに従ってデータを構成することができるようにするメタ言語である。図２は、ＸＭＬデータの例を示しており、示した構成は、郵便アドレスを表すのに役立つ可能性がある。
【００２３】
ＸＭＬでは、データ項目が、要素名または「タグ」名に関連付けられる。タグは、区切られたデータの先頭が山括弧「＜」と「＞」の中に囲まれたタグ名によってマークを付けられ、区切られたデータの終りが、スラッシュ（ｓｌａｓｈ）が前に付き、山括弧で囲まれたタグ名によってマークを付けられるという構文規則（ｓｙｎｔａｃｔｉｃ  ｃｏｎｖｅｎｔｉｏｎ）を用いて、区切り記号として使用することができる。以下は、その規則に従うＸＭＬデータの例である。
＜Ａ＞
タグ「Ａ」で区切られたデータ
＜／Ａ＞
【００２４】
図２では、メッセージ２００がアドレスである。区切り記号＜ＡＤＤＲＥＳＳ＞（２０２）と＜／ＡＤＤＲＥＳＳ＞（２２２）が、メッセージ全体を囲み、データのすべてが「ＡＤＤＲＥＳＳ」要素の一部であることを示している。ＡＤＤＲＥＳＳ要素は、次の２つの下位要素を含む。すなわち、ＳＴＲＥＥＴ要素およびＣＩＴＹＳＴＡＴＥＺＩＰ要素である。ＳＴＲＥＥＴ要素は、「メインストリート１２３番地」（２０４）に設定される。ＣＩＴＹＳＴＡＴＥＺＩＰ要素は、他の要素を含む複合要素であり、それらの含まれる要素が、区切り記号２０６と２２０で囲まれている。ＣＩＴＹＳＴＡＴＥＺＩＰ要素は、「レッドモンド市」に設定されたＣＩＴＹ要素（２０８）、「ワシントン州」に設定されたＳＴＡＴＥ要素（２１０）、およびＺＩＰ要素を含み、ＺＩＰ要素は、含まれる要素に区切り記号２１２と２１８によってマークを付けられている複合体である。ＺＩＰ要素は、「９８０５２」に設定された要素ＦＩＶＥＤＩＧＩＴ（２１４）、および「０１２３」に設定された要素ＰＬＵＳＦＯＵＲ（２１６）を含む。したがって、メッセージ２００は、アドレスをデータの階層的集合として記述している。
【００２５】
ＸＭＬメッセージは、ツリーデータ構造に対応することが認められよう。図３は、メッセージ２００に対応するツリー３００を示している。ノード３０２が、図２の「ＡＤＤＲＥＳＳ」タグに対応し、ノード３０２のサブツリー群のすべてが、区切り記号＜ＡＤＤＲＥＳＳ＞２０２と＜／ＡＤＤＲＥＳＳ＞２２２（図２に示す）の範囲内に含まれる要素群に対応する。その含まれる要素群が、ＳＴＲＥＥＴ要素２０４、ならびにＣＩＴＹＳＴＡＴＥＺＩＰ要素である。前述したとおり、ＣＩＴＹＳＴＡＴＥＺＩＰは、他の要素を含む複合体である。ノード３０４が、ＣＩＴＹＳＴＡＴＥＺＩＰタグに対応し、ノード３０４のサブツリー群のすべてが、区切り記号＜ＣＩＴＹＳＴＡＴＥＺＩＰ＞２０６と＜／ＣＩＴＹＳＴＡＴＥＺＩＰ＞２２０（図２に示す）の範囲内に含まれる要素群に対応する。その含まれる要素群が、ＣＩＴＹ要素２０８、ＳＴＡＴＥ要素２１０、およびＺＩＰ要素である。ＺＩＰ要素は、他の要素を含む複合体である。このため、ノード３０６が、ＺＩＰタグに対応し、ノード３０６のサブツリー群のすべてが、区切り記号＜ＺＩＰ＞２１２と＜／ＺＩＰ＞２１８の範囲内に含まれる要素群に対応する。その含まれる要素群が、ＦＩＶＥＤＩＧＩＴ要素２１４およびＰＬＵＳＦＯＵＲ要素２１６である。見て取ることができるとおり、ツリー３００は、ＸＭＬメッセージ２００の構造に対応し、メッセージ２００の中に含まれる郵便アドレスの階層構造を示している。
【００２６】
メッセージは、一般に、何らかのタイプの予め定められた構造、つまり「スキーマ」に従う。例えば、「アドレス」メッセージに関するスキーマにより、アドレスに存在することが可能な様々な異なるタイプの構造が定義されることが可能である。例えば、そのようなスキーマにより、アドレスメッセージがＡＤＤＲＥＳＳタグを含むものとして定義されることが可能であり、ＡＤＤＲＥＳＳタグの許される構造の詳細がさらに定義されることが可能である。例えば、スキーマは、ＡＤＤＲＥＳＳタグが、ＳＴＲＥＥＴ要素と、もう１つの要素を含むことを指定することができ、もう１つの要素は、ＣＩＴＹＳＴＡＴＥＺＩＰ（米国のアドレスの場合）またはＣＩＴＹＰＲＯＶＩＮＣＥＰＯＳＴＣＯＤＥ（カナダのアドレスの場合）、あるいは米国またはカナダ以外のアドレスの場合、ＣＩＴＹＣＯＵＮＴＲＹであることが可能である。要素の各タイプ（例えば、ＣＩＴＹＳＴＡＴＥＺＩＰ）に関して、スキーマは、その要素を構成する下位要素の許される構造を定義することができる。ＡＤＤＲＥＳＳタグのこの定義の下で、図２および３に示すメッセージ２００、ならびに対応するツリー３００は、ＡＤＤＲＥＳＳタグの許される内容の一例、すなわち、米国アドレスの構造に過ぎず、正当なＡＤＤＲＥＳＳは、代替として、前述した他のタイプの要素の１つを含むことも可能であることを理解されたい。
【００２７】
実際、スキーマは、ＸＭＬメッセージに関する許される構文を定義する。ただし、何らかのスキーマの下で構文上正しいが、何らかの実質的な規則に違反するＸＭＬメッセージを形成することが可能である。本発明は、以下により詳細に説明するとおり、ＸＭＬメッセージの実質（ｓｕｂｓｔａｎｃｅ）を検証するのに使用することができる機構を提供する。
【００２８】
（ツリー走査）
図３に関連して前述したとおり、ＸＭＬメッセージは、ツリーと見なすことができる。本発明の１つの特徴によれば、ＸＭＬメッセージによって表されるツリーは、好ましくは、深度優先順（ｄｅｐｔｈ−ｆｉｒｓｔ  ｓｅｑｕｅｎｃｅ）に走査される。ツリーにおける各ノードが見つかると、そのノードが、１つまたは複数の検証テーブルによって与えられる情報に従って検証される。ノードを「検証する」とは何を意味するか、ならびに検証テーブル自体の構造を以下により詳細に説明する。ただし、図４を参照すると、ツリーを深度優先順に走査するとは何を意味するかを示す一例が描かれている。
【００２９】
ツリー４００は、複数のノードを含む。ツリー４００のルートには、「Ａ」というラベルが付けられている。ルートノードの子には、「Ａ１」、「Ａ２」、および「Ａ３」というラベルが付けられている。これらの子のそれぞれは、図に示すとおり、「Ａ１１」、「Ａ１２」、「Ａ２１」、「Ａ２２」、「Ａ３１」、および「Ａ３２」というラベルが付けられた子を有する。
【００３０】
ツリー４００が深度優先走査順で走査される場合、ツリーの各ノードは、特定の順序（ｓｅｑｕｅｎｃｅ）で検出される。深度優先順でツリーを走査するアルゴリズムは、再帰的に定義することができる。所与のツリーに関して、
−ツリーのルートノードを最初に訪れ、
−次に、ルートノードのサブツリーが存在する場合、そのサブツリーのそれぞれを左から右の順に深度優先順で訪れる
各サブツリーは、実際、独自のルートノードを有するツリーであるため（例えば、Ａ１は、Ａのサブツリー群の１つのサブツリーのルートノードである）、サブツリーを深度優先順に走査するアルゴリズムは、最上レベルのツリーを深度優先順に走査するアルゴリズムと同一である。したがって、当業者に理解されるとおり、この走査アルゴリズムは、再帰関数として実装することができる。
【００３１】
それゆえ、ツリー４００が、この再帰アルゴリズムを使用して走査される場合、検出される最初のノードは、ルートノード「Ａ」である。次に、ルートノード「Ａ」の左端のサブツリーが、深度優先順で走査される。各サブツリーは、それ自体、ツリーであるため、そのサブツリー群のそれぞれが、ルートノードを有する。Ａの左端のサブツリーのルートノードには、「Ａ１」というラベルが付けられている。それゆえ、ノードＡを訪れた後、ツリー走査アルゴリズムは、Ａ１をルートとするサブツリーに適用され、このサブツリーにおいて訪れられる最初のノードが、Ａ１である。Ａ１もサブツリー群を有し、そのサブツリー群が、左から右の順に訪れられる。それゆえ、Ａ１が訪れられた後、ルートがＡ１１であるサブツリーが、深度優先順に走査される。Ａ１１は、子をまったく有さないので、走査されるべきＡ１１のサブツリーはまったく存在せず、したがって、Ａ１１の右側の次のサブツリー（すなわち、Ａ１２をルートとするツリー）が、深度優先順に走査される。Ａ１２も、子をまったく有さないので、やはり、走査されるべきサブツリーはまったく存在しない。それゆえ、Ａ１、およびＡ１のサブツリーの走査は完了し、アルゴリズムは、ノードＡの次のサブツリー（すなわち、Ａ２をルートとするサブツリー）を走査することに移り、Ａ１をルートとするサブツリーを走査したのと同一のやり方で、このサブツリーを走査することにとりかかる。
【００３２】
前述した再帰アルゴリズムを使用してツリーが走査された場合、結果は、図４に示した順序で、すなわち、Ａ、Ａ１、Ａ１１、Ａ１２、Ａ２、Ａ２１、Ａ２２、Ａ３、Ａ３１、Ａ３２の順序で、ツリー４００におけるノード群のすべてを訪れることになる。
【００３３】
（検証テーブル例）
前述したとおり、ＸＭＬメッセージは、スキーマの中で指定された構造または構文に準拠するが、それでもメッセージの実体の中に無効なデータを含む可能性がある。例えば、図２および３に関連して前述したとおり、メッセージは、都市＝「レッドモンド」、州＝「ワシントン州」、および郵便番号＝「９８０５２」を指定することが可能なアドレスを含むことが可能である。この情報は、構文上、有効であり（すなわち、都市、州、および郵便番号が、米国内のアドレスに関する正しい構文であることを含め）、実質的にも有効である（すなわち、９８０５２は、実際、ワシントン州レッドモンド市の正しい郵便番号である）。ただし、アドレスが実質的に有効であるかどうかをアドレスの構文から判定する方法は存在しないことに留意されたい。例えば、「レッドモンド市、ワシントン州、１９１０３」は、構文上有効なアドレスであるが、実質的に有効なアドレスではない。というのは、１９１０３は、ペンシルベニア州フィラデルフィア市の郵便番号であり、ワシントン州レッドモンド市の郵便番号ではないからである。したがって、ＸＭＬメッセージがスキーマに準拠することを保証することにより、構文上の有効性だけは保証することができるが、他のタイプの有効性は保証することができない。本発明は、ＸＭＬメッセージに対して任意の有効性試験を実行するためのフレームワークを提供する。
【００３４】
図５は、特定のタイプのＸＭＬメッセージに対して実行されるべき検証試験を指定する例示的な検証テーブル５００を示している。テーブル５００に示した諸要素は、ツリー４００の要素タイプ群に対応する（図４に示す）。すなわち、ツリー４００は、Ａ、Ａ１、Ａ１１などと名前が付けられた要素群を有し、テーブル５００も同様である。検証テーブル５００は、４つの列５０２、５０４、５０６、および５０８を含む。テーブル５００の所与の行に関して、エントリは、以下の意味を有する。すなわち、
−列５０２のエントリは、その行が該当する要素の名前であり、
−列５０４のエントリは、要素に対して指定された代理が、「排他的」であるかどうかを示し（「代理」および「排他的」という用語は、以下により詳細に説明する）、
−列５０６のエントリは、要素が見つかった際に呼び出される代理（または「ハンドラ」）の名前であり、
−列５０８のエントリは、要素、ならびにサブツリー群のすべてが処理された後に呼び出される代理である。
【００３５】
したがって、テーブル５００の最初の行は、「Ａ」という名前の要素に関して、その要素が見つかった際に「ｆＡ」という名前の代理が呼び出され、その要素に関するサブツリー群のすべてが検証された後、「ｐｏｓｔｆＡ」という名前の代理が呼び出されることを示す。さらに、この行は、この行で指定された代理群が、「排他的」でないこと、すなわち、サブツリー代理群の使用を排除しないことを示す。
【００３６】
「代理」は、特定のタイプの要素に関する検証を実行する名前の付けられたコードである。例えば、図２で説明したＣＩＴＹＳＴＡＴＥＺＩＰ要素に対する代理は、米国の都市、州、および郵便番号のテーブルを含み（または、少なくとも、調べて）、ＣＩＴＹＳＴＡＴＥＺＩＰ要素の中で指定された組合せが正しい組合せであるかどうかを判定することができる。本発明は、いずれの特定のタイプの検証試験にも限定されず、本発明を組み込んだシステムの消費者は、独自の代理を書き、要素が有効であるとは何を意味するかを定義することを自由に行えることを理解されたい。詳細には、代理は、その代理が登録されている要素の内容を考慮することに（またはその代理が登録されているサブツリー群の内容考慮することにさえ）限定されず、そのサブツリーの外部の情報も考慮することができることに注目されたい（例えば、ＣＩＴＹＳＴＡＴＥＺＩＰ要素に対する代理は、郵便番号＋４の値が有効であるかどうかを判定するために番地（ｓｔｒｅｅｔ  ａｄｄｒｅｓｓ）（図２および３に示す要素２０４）も考慮することができる）。どのような代理が書かれたかに基づいて有効性を任意に定義できることにより、任意のタイプのメッセージを検証する柔軟性が提供される。
【００３７】
一例では、代理は、Ｃ＃のようなプログラミング言語で書かれる。ただし、本発明によるシステムは、任意の名前が付けられたコードを代理として使用するように構成できることが理解されよう。
【００３８】
代理の名前が、列５０６と列５０８の両方に現れている。列５０６で指名された代理は、ツリー走査において所与の要素が訪れられた際、呼び出される代理である。列５０８で指名された代理は、要素のサブツリー群のすべてが走査された後に呼び出される。それゆえ、列５０８で指名された代理は、「ポストハンドラ」である。というのは、この代理は、その要素、ならびにその要素のサブツリー群のすべてが訪れられた後に呼び出されるからである。
【００３９】
列５０４で指定された「排他」特性は、現在の要素のサブツリー群に対する代理が呼び出されるべきかどうかを指定する。それゆえ、テーブル５００で、要素Ａ２が、排他特性を有し、タイプＡ２の要素が見つかった際、Ａ２のサブツリー群の要素に対する個々の代理は呼び出されない。というのは、Ａ２の代理が、Ａ２、およびＡ２のサブツリー群のすべてに対する「排他的」制御を有するからである。それゆえ、テーブル５００が、要素Ａ２１およびＡ２２に対する代理群を示していても、その代理群は呼び出されない。というのは、Ａ２が、「排他」特性を有し、これにより、Ａ２のサブツリー群のいずれのサブツリーにおけるいずれの要素に関しても、代理群が呼び出されることが妨げられるからである。
【００４０】
本発明によるシステムは、ＸＭＬメッセージをウォークスルーして（例えば、メッセージが表すツリーの深度優先順走査において）、検証テーブルの中の指定に従って代理群を適用する検証エンジンを含むことが可能である。検証エンジンが、検証エンジンのソースコードにアクセスする必要なしに、検証試験を変更すること、または置き換えることが可能になる、つまり、単に検証テーブルに代理を登録すること、または検証テーブルから代理の登録を抹消することによって検証試験を変更することができることが認められよう。基礎をなす検証エンジンソースコードにアクセスすることなく検証試験を変更できることは、本発明によって提供される柔軟性の一例である。
【００４１】
テーブル１は、検証テーブル５００を使用して、検証エンジンによってツリー４００（図４に示す）に対して実行される検証試験の一例を示している。左側の列は、検証プロセスにおける様々なイベント（例えば、要素の検出、および要素のサブツリー群の完了）をそれらのイベントが生じる順序で示している。右側の列は、イベントが生じた際にいずれの代理が呼び出されるかを示している。テーブル１で見て取ることができるとおり、要素Ａ２１およびＡ２２は、これらに対して登録された代理群を有するものの、Ａ２１およびＡ２２は、ノードＡ２の子であり、ノードＡ２は、排他フラグが「はい」に設定されて登録されているため、検証エンジンによって呼び出されない。（異なるメッセージにおいて、Ａ２１またはＡ２２が、排他的とマークが付けられていない何らかの他のノードの子として現れるとした場合、検証エンジンは、ノードＡ２１またはＡ２２を検出し、それらのノードが検出された時点で、代理ｆＡ２１またはｆＡ２２が呼び出される。）
【００４２】
【表１】
0004758080.tif 000002
【００４３】
本発明の１つの特徴によれば、グローバル検証テーブルとローカル検証テーブルの両方が存在することが可能である。本発明のアーキテクチャは、フィールド群、またはフィールド群のグループが、いくつかの異なるクラスのメッセージの間で共通であることが可能であるという可能性を許容する。その共通のフィールド群に関する設定は、グローバル検証テーブルの中に格納することができる。特定のクラスのメッセージだけに適用される任意の設定は、ローカル検証テーブルの中に格納することができる。実際には、ローカル検証テーブルは、グローバル検証テーブルに対する１組のクラス特有のオーバーライド（ｏｖｅｒｒｉｄｅ）として機能する。また、本発明の一実施形態では、複数のグローバル検証テーブルを作成することができ、何らかのコンテキストに基づいて特定のグローバルテーブルを使用のために選択することができる。
【００４４】
（例示的な検証プロセス）
前述したとおり、本発明による検証エンジンは、ＸＭＬメッセージをウォークスルーし、１つまたは複数の検証テーブルに従ってメッセージの中の様々な要素群に対する代理を呼び出す。以下は、検証エンジンによって実行されるプロセスの説明である。
【００４５】
検証エンジンは、ＸＭＬメッセージのルート要素（例えば、図２〜３の例におけるＡＤＤＲＥＳＳ要素、または図４の例における「Ａ」要素）から開始する。この開始要素が、「現在の」要素となるように設定される。次に、現在の要素（この説明では、「Ｘ」と呼ぶことにする）に関して、検証エンジンは、
−ローカル検証テーブル内のＸに関する「要素ハンドラ」列で代理を検索する。ローカル検証テーブル内のその列で代理が指定されている場合、エンジンは、その要素ハンドラを呼び出す。
−ローカルテーブルが、「要素ハンドラ」列でＸに対する代理を指定していない場合、エンジンは、グローバルテーブルの中でＸに対する代理を検索する。Ｘに対するハンドラが、グローバルテーブル内の「要素ハンドラ」列で指定されている場合、その指定された代理が呼び出される。いずれのテーブルも要素Ｘに対する代理を指定していない場合、要素Ｘに対する代理はまったく呼び出されない。
−要素Ｘの子要素群のそれぞれに関して、前述したステップが繰り返される（Ｘが、「排他的」として登録されていない限り）。一実施形態では、それらのステップは、要素Ｘのサブツリー群に対して呼び出すことができる再帰機能で実装される。
−（ローカルテーブルまたはグローバルテーブル内に）Ｘに対してポストハンドラ代理が存在する場合、Ｘのすべてのサブツリー群が処理された後にポストハンドラが呼び出される。（Ｘに対するポストハンドラ代理が両方のテーブルの中で存在する場合、ローカルテーブルの中で指定された代理だけが呼び出される。）
【００４６】
図６は、検証エンジンによって実行されるプロセスを流れ図の形態で示している。最初、「現在のノード」が、ツリーのルートノードとなるように定義される（６０２）（例えば、ＸＭＬメッセージにおけるルート要素）。次に、ローカル検証テーブルが調べられる。現在のノードに関するエントリが、そのノードタイプに対する代理を示すローカル検証テーブルの中に存在する場合（６０４）、そのローカル検証テーブルからのエントリが使用される（６０６）。ローカル検証テーブルの中にまったくエントリが存在しない場合、グローバル検証テーブルの中にエントリが存在するかどうかが判定される（６０７）。グローバル検証テーブルからのエントリが存在する場合、そのエントリが使用される（６０８）。ローカル検証テーブルまたはグローバル検証テーブルの中で何らかの代理が見つかったものと想定すると、その代理が呼び出される（６１０）。見つからなかった場合、プロセスは、以下に説明するとおり、６１４に進む。
【００４７】
現在のノードに関するエントリ（すなわち、いずれのテーブルが実際に使用されたにしても、ローカル検証テーブルまたはグローバル検証テーブルからのエントリ）により、エントリが「排他的」でないことが示される場合（６１２）、図６のプロセスは、現在のノードの子ノード群のそれぞれに対して再帰的に呼び出される（６１４）。好ましくは、プロセスは、その子ノード群に対して左から右の順に呼び出される。現在のノードに関するエントリにより、エントリが排他的であることが示される場合、図６のプロセスは、子ノード群に対して呼び出されない。というのは、現在のノードに関するエントリが、現在のノードのすべてのサブツリー群を排他的に制御するからである。
【００４８】
現在のノードに対するポストハンドラ代理が存在する場合（６１６）、そのポストハンドラが呼び出される（６１８）。（ポストハンドラは、６１０で代理が呼び出された後に直接に（現在のノードのエントリが排他的でる場合）、またはサブツリー群の処理の後に（現在のノードのエントリが排他的ではない場合）適用される）。ポストハンドラ代理が適用された後（またはポストハンドラ代理が存在しないと判定された後）、現在のノードが最上レベルツリーのルートであるかどうかが判定される（６２０）。現在のノードが、最上レベルツリーのルートである場合（例えば、図３のノード３０２、または図４のノード「Ａ」）、プロセスは終了する。それ以外の場合、プロセスは、呼び出し元に戻る（というのは、現在のノードが最上レベルのルートではない場合、図６のプロセスは、そのプロセスの以前のインスタンスによって再帰的に呼び出されているからである）。
【００４９】
以上の例は、説明のためだけに提示しており、本発明を限定するものとして解釈されるべきではまったくないことに留意されたい。本発明を様々な実施形態に関連して説明してきたが、本明細書で使用してきた言葉は、限定の言葉ではなく、説明および例示の言葉であることを理解されたい。さらに、本発明を本明細書で特定の手段、材料、および実施形態に関連して説明してきたが、本発明は、本明細書で開示した詳細に限定されるべきものではなく、むしろ、本発明は、添付の特許請求の範囲に含まれるようなすべての機能的に等価の構造、方法、および用途に拡張される。本明細書の教示を利用する当業者は、教示に対して多数の変更を行うことができ、本発明の範囲および趣旨を逸脱することなく本発明の態様の変更を行うことができる。
【図面の簡単な説明】
【００５０】
【図１】本発明の態様を実施することができるコンピューティング環境例を示すブロック図である。
【図２】拡張マークアップ言語（ＸＭＬ）の形態の例示的なメッセージを示すブロック図である。
【図３】図２のＸＭＬメッセージのツリー表現を示すブロック図である。
【図４】ツリーの深度優先走査を示すツリーのブロック図である。
【図５】本発明の態様による例示的な検証テーブルを示すブロック図である。
【図６】本発明の態様による例示的な検証プロセスを示す流れ図である。
【符号の説明】
【００５１】
１１０  コンピュータ
２００  メッセージ
３００  ツリー
４００  ツリー
５００  検証テーブル
【図１】
0004758080.tif 000003
【図２】
0004758080.tif 000004
【図３】
0004758080.tif 000005
【図４】
0004758080.tif 000006
【図５】
0004758080.tif 000007
【図６】
0004758080.tif 000008