図1は、XMLデータ文書を生成、送信、及び処理できるデータ処理システム10を示す。データ処理システム10は、生成アプリケーション20a、20b、ジェネリックエンコーダ30、スペシフィックエンコーダ35、スキーマコンパイラ40、文書デコーダ50、受信アプリケーション60を含む。生成アプリケーション20がデータ文書70を生成し、受信アプリケーション60への送信のためにジェネリックエンコーダ30またはスペシフィックエンコーダ35がそのデータ文書70を符号化する。一部の実施形態において、データ処理システム10は、コンパイルされたスキーマ85と符号化・処理方法を用いて生成アプリケーション20と受信アプリケーション60の間で交換される情報を削減する。結果として、一部の実施形態において、データ処理システム10は、データ文書70に含まれた情報の利用に必要なメモリ及び処理資源を削減することができる。
生成アプリケーション20aは、XML言語その他のテキストベースのマークアップ言語、プロトコル、または標準規格に従って構造化されフォーマットされたデータを含むデータ文書70を生成する。以下の説明では、XML言語に従ったデータ文書を利用するように構成されたデータ処理システム10に焦点をあてるが、データ処理システム10及び/またはそのデータ処理システム10の個別のコンポーネントは、XML、ハイパーテキストマークアップ言語(HTML)、汎用マークアップ言語(SGML)を含む(しかし、これらに限定はされない)適当なマークアップ言語のデータ文書70を処理するように構成されている。生成アプリケーション20bは結合前データ文書78を生成する。この結合前データ文書78は、データ文書70に含まれるデータ構造を含むが、スキーマに結合されている。これについては、以下により詳しく説明する。結合前データ文書78は、例えば、区切られる構造の名前またはタイプを特定するXMLスタイルのテキストデリミタではなく、数値デリミタを利用する。この説明では、生成アプリケーション20は、データ文書を読み出すためにデータ処理システム10のメモリ100にアクセスすることにより、またはデータ処理システム10の他のコンポーネントからデータ文書70を読み出すことにより、または自分自身でデータ文書70を生成することにより、データ文書を「生成」する。一例として、生成アプリケーション20は、ユーザ入力に基づきXML購入要求を形成し、それを受信アプリケーション60に送信するウェブブラウザを表す。他の例として、生成アプリケーション20は、データ文書70にコンタクト情報を保存し、携帯電話やパーソナルデジタルアシスタント(PDA)にデータ文書70を送信して受信アプリケーション60で利用させるデスクトップコンピュータ上の住所録アプリケーションを表す。
一部の実施形態において、生成アプリケーション20は、プロセッサその他の好適な電子計算デバイス上で実行されるソフトウェアプロセスを表す。この説明及び請求項においては、「プロセッサ」とは、汎用コンピュータ、専用マイクロプロセッサ、その他の電子情報を生成、処理、及び/または通信可能な処理デバイスを表す。プロセッサ110の例としては、特定用途集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、その他の好適な専用または汎用プロセッサがある。
しかし、一般的に、生成アプリケーション20は、上述の機能を提供する適当なソフトウェア及び/またはハードウェアを表し、及び/または含んでいる。また、図1は生成アプリケーション20aと20bを両方とも含むデータ処理システム10の実施形態を示しているが、データ処理システム10は生成アプリケーション20aと20bのいずれかを含んでもよいし、両方を含んでもよい。さらにまた、一部の実施形態において、1つのデータ処理システム10の1つの構成要素が必要に応じてデータ文書70と結合前データ文書78の両方を生成でき、生成アプリケーション20aと20bの両方を表していてもよい。
受信アプリケーション60は、文書デコーダ50またはデータ処理システム10の他のコンポーネントからデータ文書70を受信し、そのデータ文書70を用いてタスクまたは動作を実行する。データ処理システム10は、生成アプリケーション20と受信アプリケーション60を接続するネットワークその他の好適な接続コンポーネントを含む。一例として、受信アプリケーション60は、データ文書70に含まれる顧客オーダーを処理する、データ処理システム10中のネットワークされたコンピュータ上で実行されているアプリケーションを表す。他の例として、受信アプリケーション60は、データ文書70として移動通信装置にアップロードされたコンタクト情報にアクセスすることができるその移動通信装置上で実行されているアプリケーションを表す。また、一実施形態において、生成アプリケーション20と受信アプリケーション60は、動作の異なるフェーズにある、または異なるタスクを実行している同一のアプリケーション、同一のプロセス、または同一のコンポーネントグループを表している。例えば、生成アプリケーション20は、1つのアプリケーションがデータ文書70を生成してメモリ100に格納しているところを表し、受信アプリケーション60は、そのアプリケーションがデータ文書70をそのメモリ100から読み出しているところを表している。一般的に、受信アプリケーション60は、上述の機能を提供する適当なソフトウェア及び/またはハードウェアの集まりを表し、または含んでいる。一部の実施形態において、受信アプリケーション60は、コンピュータプロセッサ上で実行されているソフトウェアプロセスを表す。
スキーマコンパイラ40は、コンパイルされていないスキーマ80をコンパイルして、コンパイルされたスキーマ85を作る。一実施形態において、スキーマコンパイラ40は、コンパイルされたスキーマを生成する。コンパイルされたスキーマは、プリミティブデータの少なくとも1つの配列である。スキーマコンパイラ40は、コンパイルされたスキーマ85をデータ処理システム10のジェネリックエンコーダ30その他のコンポーネントに供給する。スキーマコンパイラ40は、ジェネリックエンコーダ30のコンポーネント、モジュール、その他適当な部分であってもよいし、ジェネリックエンコーダ30とは物理的に、及び/または論理的に異なるコンポーネントであってもよい。一部の実施形態において、スキーマコンパイラ40は、コンピュータプロセッサ上で実行されているソフトウェアプロセスである。
ジェネリックエンコーダ30は、データ文書70を指定されたデータの定義と結合して、データ文書70を符号化して、符号化文書72aを作る。より具体的には、一部の実施形態において、ジェネリックエンコーダ30は、生成アプリケーション20からデータ文書70を受け取り、スキーマコンパイラ40からコンパイルされたスキーマ85を受け取る。ジェネリックエンコーダ30は、データ文書70中の1つ以上のデータノード90をコンパイルされたスキーマ85中の定義と結合し、結合したデータノードを符号化して符号化文書72aを作成する。ジェネリックエンコーダ30は、上述の機能を提供するのに好適なハードウェア及び/またはソフトウェアを表しているか、または含んでいる。さらにまた、ジェネリックエンコーダ30は、生成アプリケーション20または受信アプリケーション60の一部を表していてもよく、または生成アプリケーション20または受信アプリケーション60のいずれとも物理的及び/または論理的に異なるコンポーネントを表していてもよい。一部の実施形態においては、ジェネリックエンコーダ30は、コンピュータプロセッサ上で実行されているソフトウェアプロセスを表している。
スペシフィックエンコーダ35は、結合前文書78を符号化して、符号化文書72bを生成する。より具体的には、一部の実施形態において、生成アプリケーション20がすでにコンパイルされたスキーマ85中の定義に結合したデータ文書を受け取る。
このような実施形態において、スペシフィックエンコーダ35は、結合にはかかわらずに、生成アプリケーション20から受け取った結合前文書78を符号化する。スペシフィックエンコーダ35は、上述の機能を提供する好適なハードウェア及び/またはソフトウェアであればいかなるものを表しても、または含んでもよい。さらにまた、スペシフィックエンコーダ35は、生成アプリケーション20または受信アプリケーション60のコンポーネント、モジュール、またはその他の部分を表していてもよく、またはとは物理的及び/または論理的に異なるコンポーネントを表していてもよい。図1及び以下の説明では、例示を目的として、データ処理システム10はジェネリックエンコーダ30とスペシフィックエンコーダを両方とも含むものとするが、実施形態に応じて、データ処理システム10はジェネリックエンコーダ30とスペシフィックエンコーダ35のいずれか一方または両方を含んでいてもよい。一部の実施形態において、スペシフィックエンコーダ35は、コンピュータプロセッサ上で実行されているソフトウェアプロセスを表す。
文書デコーダ50は、受信アプリケーション60による使用のために符号化文書72を受け取り復号する。特に、文書デコーダ50は、符号化文書72から復号文書74を生成するために、コンパイルされたスキーマ85を参照する。復号文書74は、データ文書70のデータノード90、またはそのデータノード90に含まれる情報と実質的に等価な情報を含むその他のマークアップ言語データ構成を含む。一部の実施形態において、復号文書74は、下のデータ文書70と同一であってもよい。一部の実施形態において、文書エンコーダ50は、コンピュータプロセッサ上で実行されているソフトウェアプロセスを表す。
メモリ100は、データ文書70、符号化文書72、復号文書74、及び/または動作中のデータ処理システム10のエレメントにより使用される値とパラメータを格納する。メモリ100は、データを格納するのに好適な揮発性または不揮発性の、ローカルまたはリモートのデバイスならいかなるものでもよく、例えば、ランダムアクセスメモリ(RAM)、読み出し専用メモリ(ROM)、磁気記憶装置、光記憶装置、その他の好適なデータ記憶装置である。以下の説明において、「メモリ100」という用語は、データ処理システム10中のメモリデバイス、データ処理システム10に結合したメモリデバイス、またはデータ処理システム10またはそのエレメントがアクセス可能なメモリデバイスを指す。このように、この説明においては、同じ「メモリ100」であっても、データ処理システム10の実施形態の構成と内容に応じて、必ずしも物理的に同じデバイスをさしているとは限らない。
図1は、一定数のプロセッサ110を含むデータ処理システム10の一実施形態を示しているが、データ処理システム10に含まれるプロセッサ110の数はいくつであっても好適な数であればよい。また、図1は、別々のプロセッサ110上で実行されている生成アプリケーション20、ジェネリックエンコーダ30、スペシフィックエンコーダ35、スキーマコンパイラ40、文書デコーダ50、及び、受信アプリケーション60を含むデータ処理システム10を示しているが、これらのエレメントのうち2つ以上が同じプロセッサ110上で実行されてもよい。結果として、これらのエレメントは、1つ以上のプロセッサ110において一括または分散して実行される。
動作中、スキーマコンパイラ40は未コンパイルスキーマ80を受信するか、またはその未コンパイルスキーマ80にアクセスする。スキーマコンパイラ40は、未コンパイルスキーマ80を生成し、データ処理システム10の他のコンポーネントから未コンパイルスキーマ80を受信し、スキーマコンパイラ40に結合したメモリ100から未コンパイルスキーマ80を読み出し、またはその他の好適な方法で未コンパイルスキーマ80を取得する。未コンパイルスキーマ80は、1つ以上の定義ノードを含む。定義ノードは、データ処理システム10に内で定義された、または認識された、もしくはデータ処理システム10によりサポートされた、データノード90の内容、構造、好適な発生回数、及び/またはその他の好適な特徴(以下、集合的に「定義内容」と呼ぶ)を定義している。一実施形態において、データ処理システム10はXML文書70を処理するように構成され、未コンパイルスキーマ80はXMLスキーマを含む文書を表す。しかし、未コンパイルスキーマ80は、データ処理システム10によりサポートされたマークアップ言語に基づく好適な形式のデータ定義を含む。
スキーマコンパイラ40は、未コンパイルスキーマ80をコンパイルして、コンパイル済みスキーマ85を作成する。未コンパイルスキーマ80をコンパイルする際、スキーマコンパイラ40は、未コンパイルスキーマ80に含まれている冗長な、または不必要な情報を減少または削除することにより、未コンパイルスキーマ80のサイズを小さくしてもよい。スキーマコンパイラ40は、未コンパイルスキーマ80、スキーマコンパイラ40、及びデータ処理システム10の特徴と構成に基づき、未コンパイルスキーマ80をさらに処理するステップを追加的に実行することもできる。図2Aは、データ処理システム10の一実施形態において使用されるコンパイル済みスキーマ85の内容を示す。以下、詳しく説明する。スキーマコンパイラ40は、コンパイル済みスキーマ85を作成するために未コンパイルスキーマ80をコンパイルした後、ジェネリックエンコーダ30にコンパイル済みスキーマ85を送信または供給する。一部の実施形態において、スキーマコンパイラ40は、コンパイル済みスキーマ85をジェネリックエンコーダ30に供給するが、それはジェネリックエンコーダ30とスキーマコンパイラ40が共にアクセス可能なメモリ100にコンパイル済みスキーマ85を保存することにより行う。
適当な時に、ジェネリックエンコーダ30は、生成アプリケーション20から1つ以上のデータ文書70を受け取る。ジェネリックエンコーダ30は、コンパイル済みスキーマ85を用いて、データノード90をコンパイル済みスキーマ85に結合し、結合データノード90を符号化して符号化文書72を作成する。ジェネリックエンコーダ30は、データノード90を結合する時、データ文書70中の各データノード90に対して、そのデータノードのノードタイプに基づいて、コンパイル済みスキーマ85中の定義ノード210を特定する。ジェネリックエンコーダ30は、定義ノード210中の情報を考慮して冗長であるか、または不必要である情報をこれらのデータノード90から減少または削除する。このプロセスは、以下、図3に示した一実施形態を参照してより詳しく説明する。
ジェネリックエンコーダ30は、データ文書70を符号化する時、データ文書70に含まれるデータを削除、再構成、代替、再フォーマット、または修正して、データ文書70のサイズを小さくし、及び/またはデータ文書70の処理に必要な計算を減少させる。例えば、ジェネリックエンコーダ30は、一実施形態において、符号化文書72を生成する際、データ文書70中で使用されるデリミタの数を減らし、テキストエレメントを情報交換用米国標準コード(ASCII)からユニコード・トランスフォーメーション・フォーマット(UTF−8)に変換する。ジェネリックエンコーダ30の動作は、図4Aないし図4Cを参照してより詳しく説明する。
スペシフィックエンコーダ35は、生成アプリケーション20により生成された情報も符号化する。より具体的に、スペシフィックエンコーダ35は、生成アプリケーション20により生成された結合前文書78を符号化する。結合前文書78は、生成アプリケーション20により生成されてすでにコンパイル済みスキーマ85と結合されたデータノード90と実質的に等価な情報を含む1つ以上の(図5に示した)結合済みデータノード500を含む。スペシフィックエンコーダ35は、一実施形態において、符号化文書72を生成する際、結合前文書78中で使用されるデリミタの数を減らし、テキストエレメントを情報交換用米国標準コード(ASCII)からユニコード・トランスフォーメーション・フォーマット(UTF−8)に変換する。スペシフィックエンコーダ35の動作は、図5Aないし図5Cを参照してより詳しく説明する。
文書デコーダ50は、ジェネリックエンコーダ30及び/またはスペシフィックエンコーダ35から符号化文書72を受け取り、符号化文書72を復号して復号文書74を作成する。符号化文書72を復号する際、文書デコーダ50は、データ文書70を再構成、代替、再フォーマット、または再配置して、符号化文書72を受信アプリケーション60が使用できる形式に変換する。一例として、文書デコーダ50は、結合データノード90を元のデータノード90またはその元のデータノード90に含まれる情報と同様な情報を含む他の形式のデータノードに変換する。一実施形態において、文書デコーダ50は、結合データノード90をXML言語データ構造を表す復号データノード90に変換する。文書デコーダ50の動作は、図5を参照してより詳しく説明する。
符号化文書72を復号した後、文書デコーダ50は、データ文書70を受信アプリケーション60に送信する。受信アプリケーション60は、その受信アプリケーション60とデータ処理システム10の構成と特徴に基づき、好適なやり方で復号文書74を使用する。例えば、一実施形態において、受信アプリケーション60は、移動通信装置の電話帳アプリケーションを表し、復号文書74の復号データノード90として受信したコンタクト情報を表示することができる。
一部の実施形態において、データ処理システム10は、データ処理システム10のコンポーネント間で送信される情報量を減らし、データ文書70の処理に必要な計算資源を減らすので、メモリ資源、処理資源、パワー資源などが限られていても動作可能である。さらにまた、データ処理システム10のコンポーネントにより実行される動作では必要な計算量が減らされるので、動作が速くなり効率的になるという利益がある。また、データ処理システム10は、そのコンポーネントを接続するネットワークその他の接続エレメントを含み、上述の方法はトラフィックを減少させるという利益も提供するものである。
図2Aは、データ処理システム10の一実施形態により利用される未コンパイルスキーマ80の一部の内容を示している。未コンパイルスキーマ80は、データ処理システム10により認識、サポート、または理解されたデータノード90の1つ以上のタイプの定義ノード210を含んでいる。一実施形態において、データ処理システム10はXMLデータ文書を利用し、このような実施形態においては、未コンパイルスキーマ80がXMLスキーマ構造を用いてこれらのデータノードを定義する。図示した実施形態において、未コンパイルスキーマ80は、複数の定義ノード210を含む。各定義ノード210は、データ処理システム10によりサポートされたデータノード90のタイプを定義する。データノード90は、図4Aを参照してより詳細に説明する。
定義ノード210は、関連するデータノード90の内容、フォーマット、及び/またはその他の特徴を定義するのに好適なスキーマ定義またはその他のデータ定義を表す。また、未コンパイルスキーマ80は、1つ以上の異なるタイプの定義ノード210を含み、各定義ノード210はデータ処理システム10のコンポーネントによりそれぞれの方法で処理される。より詳細は以下に説明する。例えば、一実施形態において、データ処理システムは、XMLスキーマ標準規格に基づくスキーマタイプを含む未コンパイルスキーマ80を利用する。スキーマタイプには、例えば、スキーマ、エレメント、属性、名前空間、シンプルタイプ、コンプレックスタイプ、パーティクル、グループ、ワイルドカード、属性ユースノード等が含まれるが、これに限定されない。
定義ノード210は、関連する定義ノード210の構造に応じて他の定義ノードを含んでもよい。この説明の目的において、一定義ノード210に含まれる定義ノード210は、その一定義ノード210の「子」と考えられ、その一定義ノード210はその含まれる定義ノード210の「親」と考えられる。例えば、図示した未コンパイルスキーマ80において、定義ノード210bは、定義ノード210cと210dに含まれ、定義ノード210dは、定義ノード210e、210f、210g、及び210hを含む。このように、定義ノード210cと210dは定義ノード210bの子ノードである。同様に、定義ノード210e、210f、210g、及び210hは、定義ノード210dの子ノードである。
図2Bは、スキーマコンパイラ40の一部の実施形態により利用される方法により未コンパイルスキーマ80をコンパイルする際のスキーマコンパイラ40の動作を示す。上述の通り、スキーマコンパイラ40は、データ処理システム10の他のコンポーネントから未コンパイルスキーマ80を受信し、メモリ100から未コンパイルスキーマ80を読み出し、独立して未コンパイルスキーマ80を生成し、またはその他の好適な方法で未コンパイルスキーマ80を取得する。スキーマコンパイラ40は、データ処理システム10によりサポートされたデータ定義を格納するのに必要なメモリ空間量を減らしつつ、未コンパイルスキーマ80をコンパイルする。
より具体的に、スキーマコンパイラ40は、未コンパイルスキーマ80を取得して、その未コンパイルスキーマ80の解析を開始する。図示した実施形態において、スキーマコンパイラ40は、未コンパイルスキーマ80中の各定義ノード210に対して、ノードアレイ250と名前アレイ260を生成する。ノードアレイ250と名前アレイ260は、それぞれ好適な形式のデータ構造を表し、例えば、アレイ、レコード、スタック、オブジェクト、またはその他の好適なデータ構造を含む。ノードアレイ250は、未コンパイルスキーマ80で定義された定義ノード210の階層関係を表す、ノードエントリー252として格納された情報を含む。各ノードエントリー252は、そのノードエントリー252と関連づけられた定義ノード210の子と、その定義ノードのその他の特性とを特定するまた、各ノードエントリー252は、同じ定義ノード210と関連づけられた名前アレイ260中の名前エントリー262への参照244を含む。参照244は、ポインター、リンク、その他の形式の参照を表す。
ノードエントリー252は、定義されたノード90の内容、構造、フォーマット、及び/またはその他の特徴を記述する好適なその他の情報を含んでもよい。例えば、一実施形態において、ノードエントリー252は、最小発生値280及び最大発生値282等の情報を含む。図示した実施形態において、最小発生値280と最大発生値282は、それぞれ関連するノード90が親のインスタンス内に現れるべき最小回数と最大回数を表し、関連する定義ノード210と関連づけられたXMLスキーマエレメントのminOccursおよびmaxOccursからスキーマコンパイラ40により生成される。例えば、パーティクルエントリー254xの最小発生値280と最大発生値282は、コンパイル済みスキーマ85による「書籍」エレメントにおいて「書名」エレメントが最低1回かつ最高1回現れるべきことを示している。
名前アレイ260は、その定義ノード210のテキスト名を特定する各定義ノード210の名前エントリー262を含む。一実施形態において、名前エントリー262は、定義ノード210のテキスト名を指示するテキスト識別子264を含む。一実施形態において、名前エントリー262は、その名前エントリー262と関連づけられたノードエントリー252への逆参照も含む。一般的に、名前エントリー262は、適当な追加的情報を含んでもよい。
スキーマコンパイラ40は、未コンパイルスキーマ80を解析する際、そのスキーマコンパイラ40により特定された未コンパイルスキーマ80中の各追加的定義ノード210に対してノードアレイ250中に新しいノードアレイ252を生成する。定義ノードのタイプに応じて、スキーマコンパイラ40は、新しい名前エントリー262を名前アレイ260に追加する。スキーマコンパイラ40は、この他のステップや動作を適宜実行して、未コンパイルスキーマ80をコンパイルする。
例えば、図示して実施形態において、XMLスキーマ定義を利用して、スキーマコンパイラ40は未コンパイルスキーマ80の各スキーマノードに対してノードエントリー252を生成する。図2Aの定義ノード210aと210c等のグループノードに対して、スキーマコンパイラ40は、ノードアレイ250中に、「グループエントリー256」と呼ばれる、一タイプのノードエントリー252を生成する。グループエントリー256は、関連するグループ定義ノード210のグループタイプを指定するグループ識別子272と、グループ定義ノード210の各子に対するパーティクルエントリー274を含む1つ以上のデリゲーションテーブル270とを含む。各パーティクルエントリー274は、1つのエレメントまたは関連するグループの子である他のグループと関連づけられたエントリーへの参照244を含む。例えば、図2Aの未コンパイルスキーマ80をコンパイルする際、スキーマコンパイラ40は、定義ノード210cに対して状態デリゲーションテーブル270を生成する。その状態デリゲーションテーブル270は、定義ノード210f−gを含む、定義ノード210cの子のノードエントリー252へのポインターを含む。グループエントリー256は、スキーマコンパイラ40の構成と特徴に基づき、さらに別の情報を含んでもよい。例えば、一実施形態において、グループエントリー256は、関連づけられた状態デリゲーションテーブル270のサイズを指定するグループエントリー256にサイズ値258を含める。
上述の通り、グループエントリー256は、1つ以上の状態デリゲーションテーブル270を含んでいる。一実施形態において、スキーマコンパイラ40がすべてのグループノード、または「選択された」グループノード(例えば定義ノード210g)のグループエントリーを生成する時、スキーマコンパイラ40はその定義ノード210に対して単一の状態デリゲーションテーブル270を生成する。スキーマコンパイラ40は、未コンパイルスキーマ80中の「シーケンス」グループノードに来たとき、「シーケンス」グループの各子定義ノード210の状態デリゲーションテーブル270を生成する。このように、未コンパイルスキーマ80をコンパイルする際、スキーマコンパイラ40は、子定義ノード210f−kのそれぞれについて1つずつ、定義ノード210dの4つの別々な状態デリゲーションテーブル270を生成する。このような状況において、各状態デリゲーションテーブル270は、関連する「シーケンス」グループ定義ノード210を解析する各ステップにつづく、残りの子定義ノード210への参照を含む。
例えば、エレメント「A」、エレメント「B」、及びエレメント「C」を含むと定義された「シーケンス」グループ定義ノード210について、スキーマコンパイラ40は、エレメント「A」、エレメント「B」、及びエレメント「C」への別々の参照244を有する第1の状態デリゲーションテーブル270と、エレメント「B」及びエレメント「C」への参照244を有する第2の状態デリゲーションテーブル270と、エレメント「C」への参照244を有する第3の状態デリゲーションテーブル270を生成する。対照的に、スキーマコンパイラ40のこの実施形態においては、同じエレメントを含むとして定義された「全」グループ定義ノード210は、各エレメント「A」、エレメント「B」、及びエレメント「C」への別々の参照244を有する単一の状態デリゲーションテーブル270だけを有する。
エレメントノード、属性ノード、インスタンス化するときに定義ノード210hや210qなどのサブスタンスを含むXMLオブジェクトを定義するその他の形式の非グループノードに対して、スキーマコンパイラ40は、ノードアレイ250中に、「サブスタンスエントリー254」と呼ばれる、一タイプのノードエントリー252を生成する。サブスタンスエントリー254は、関連するエレメントノードと関連づけられた名前エントリー262への参照244を含む。サブスタンスエントリー254と関連づけられた定義ノード210についてが子定義ノード210を含む場合、サブスタンスエントリー254は、その子定義ノード210と関連づけられたサブスタンスエントリー254またはグループエントリー256への参照244を含む。サブスタンスエントリー254は、スキーマコンパイラ40の構成と特徴に基づき、さらに別の情報を含んでもよい。例えば、サブスタンスエントリー254は、そのサブスタンスエントリー254の「エレメント」、「属性」、または「ワイルドカード」等のノードタイプを指定するサブスタンス識別子を含んでもよい。
スキーマコンパイラ40は、未コンパイルスキーマ80を解析するに従って、各定義ノード210のノードエントリー252を生成し、親定義ノード210の子のノードエントリーへの適当な参照244を有する、その定義ノード210の各子のノードエントリー252を生成しながら、未コンパイルスキーマ80の階層構造を調べていく。スキーマコンパイラ40は、適宜、ノードエントリー252の名前アレイ260に名前エントリー262も生成する。スキーマコンパイラ40は、未コンパイルスキーマ80の解析が終わると、またはその他の適当な時に、コンパイル済みスキーマ85を表すファイルにノードアレイ250と名前アレイ260を両方とも書き込む。また、スキーマコンパイラ40は、コンパイル済みスキーマ85を、ジェネリックエンコーダ30がデータ文書70の符号化で利用できるようにするが、これについては図4Aないし図4Cを参照してより詳しく説明する。
一部の実施形態において、スキーマコンパイラ40は、各定義ノード210のために保持されている情報量を減少させることにより、未コンパイルスキーマ80よりも小さいが未コンパイルスキーマ80と同等の情報を提供するコンパイル済みスキーマ85を生成する。さらにまた、コンパイル済みスキーマ85の構造により、コンパイル済みスキーマ85の個別のエレメントへのアクセスが非常に柔軟かつ単純になる。結果として、スキーマコンパイラ40と上述のコンパイル済みスキーマ85の生成方法は、データ処理システム10に複数の動作上の利益を与える。
図3は、コンパイル済みスキーマ85のノードエントリー252に順次アクセスする方法を示す図である。そのコンパイル済みスキーマ85は、データ処理システム10の実施形態の処理コンポーネント300により使用される。コンパイル済みスキーマ85のノードエントリー250のエレメントに、階層的にではなく順次アクセスすることにより、複数のコンパイル済みスキーマ85を連結するなどの動作をより効率的に実行することができる。特に、階層的にノードエントリー252にアクセスするには、そのノードエントリー252と関連づけられた各子ノードエントリー252にアクセスするためにそのノードエントリー252に少なくとも2回アクセスする必要がある。結果として、順次アクセスとすれば、一定の動作を実行するために必要な時間と計算ステップを減らすことができる。
処理コンポーネント300は、スキーマコンパイラ40、ジェネリックエンコーダ30などを表し、または、データ処理システム10のその他のコンポーネント(図1に示していないコンポーネントや上述していないコンポーネントも含む)であってコンパイル済みスキーマ85を処理、管理、または利用するコンポーネントを表す。一例として、処理コンポーネント300は、データ処理システム10上のコンパイル済みスキーマ85を管理する、データ処理システム10のデータ管理モジュールを表してもよい。他の例として、以下により詳しく説明するように、ジェネリックエンコーダ30の一部の実施形態は、コンパイル済みスキーマ85を利用して、符号化の際、データ文書70のデータノード90を定義ノード210に結合する。このように、処理コンポーネント300は、複数のコンパイル済みスキーマ85を連結する上記の方法を使用するスキーマコンパイラ40の一実施形態を表す。一般的に、処理コンポーネント300は、上記の機能を好適に提供するハードウェア及び/またはソフトウェアの集まりを表し、コンパイル済みスキーマ85を用いる動作を実行する際、上記の方法を用いてコンパイル済みスキーマ85中の情報にアクセスする。
処理コンポーネント300は、動作中、コンパイル済みスキーマ85を受け取り、読み出し、または生成する。処理コンポーネント300は、矢印372aで示したように、コンパイル済みスキーマ85のノードアレイ250のノードエントリー252にアクセスする。アクセスされるノードエントリー252は、ノードアレイ250中の最初のノードエントリー252、コンパイル済みスキーマ85の1つのエレメントと関連づけられたノードエントリー252、またはコンパイル済みスキーマ85のその他のノードエントリー252である。例示を目的として、この説明では、処理コンポーネント300がノードアレイ250中の最初のノードエントリー252(以下、「第1のノードエントリー252a」と呼ぶ)にアクセスすると仮定する。処理コンポーネント300は、コンパイル済みスキーマ85の最初のラインを読むことにより、他のコンポーネント、アプリケーションから取得したインデックスまたはポインターを用いることにより、または、他の適当な方法により、第1のノードエントリー252aにアクセスする。処理コンポーネント300は、ノードアレイ250の第1のノードエントリー252aにアクセスすると、データ処理システム10の一部の実施形態において、コンパイル済みスキーマ85の特徴を用いて後続のノードエントリー252に順次アクセスする。より具体的に、処理コンポーネント300は、その定義ノード210のノードタイプと関連づけられたサイズ値に基づき、ノードエントリー252のサイズを決定する。処理コンポーネント300は、その定義ノード210のサイズを用いてノードアレイ250中の次の定義ノード210にアクセスする。
例えば、図示した実施形態において、処理コンポーネント300はメモリ100にサイズテーブル310を保持する。サイズテーブル310は、各ノードタイプ320と関連づけられた1つ以上のサイズ値を指定する。処理コンポーネント300は、ノードエントリー252のノードタイプ320を決定した後、このサイズテーブル310にアクセスして、そのノードエントリー252のサイズを決定する。図3には好適なサイズ値をサイズテーブル310に保持する処理コンポーネント300の実施形態を示したが、処理コンポーネント300は好適なものであればいかなる仕方でサイズ値を保持してもよい。また、処理コンポーネント300は、動作中にデータ処理システム10の他のコンポーネントからサイズ値を受け取ってもよいし、必要なサイズ値を決定してもよい。一般的に、処理コンポーネント300は、サイズ値をいかなる好適なやり方でも保持、受け取り、生成、または取得することができる。
XMLをサポートするデータ処理システム10の一実施形態において、コンパイル済みスキーマ85のノードアレイ250は、以下のノードと関連づけられたノードエントリー252を含んでもよい:未コンパイルスキーマ80中のスキーマノード、エレメントノード、属性ノード、名前空間ノード、シンプルタイプノード、コンプレックスタイプノード、パーティクルノード、グループノード、ワイルドカードノード、及び属性使用ノード。また、ノードアレイ250は、各グループ定義ノード210に対して、そのグループ定義ノード210と関連づけられた状態デリゲーションテーブル270を表す1つ以上のノードエントリー252を含む。上述の通り、ノードエントリー252のサイズは、少なくとも部分的には、そのノードエントリー252と関連づけられた定義ノード210のタイプに基づく。
より具体的に、データ処理システム10の図示した実施形態において、エレメントノード、属性ノード、コンプレックスタイプノード、パーティクルノード、属性使用ノードと関連づけられたノードエントリー252は関連づけられた定義ノード210のタイプに基づいて決められたサイズを有する。例えば、エレメントノードと関連づけられたノードエントリー252は8バイトの固定サイズを有する。処理コンポーネント300は、固定サイズノードエントリー252と関連づけられたノードタイプを判断して、そのノードタイプの固定サイズ値350を指定する記憶された情報にアクセスすることにより、固定サイズノードエントリー252のサイズを決定する。 例えば、図示した実施形態において、処理コンポーネント300はメモリ100にサイズテーブル310を保持する。サイズテーブル310は、各ノードタイプ320と関連づけられた1つ以上のサイズ値を指定する。処理コンポーネント300は、ノードエントリー252のノードタイプ320を決定した後、このサイズテーブル310にアクセスして、そのノードエントリー252のサイズを決定する。しかし、一般的に、処理コンポーネント300またはその他のデータ処理システム10は、固定サイズノードタイプ320のサイズを何らかの好適な形式で示す固定サイズ値250を何らかの適当な方法により保持する。
また、データ処理システム10のこの実施形態において、スキーマノード、名前空間ノード、シンプルタイプノード、グループノード、及びワイルドカードノードと関連づけられたノードエントリー252は可変サイズを有する。可変サイズは、そのノードタイプ350と関連づけられた固定部分と、可変サイズノードエントリー252のコンテントにより決まる可変部分との両方に基づく。特に、可変サイズは、そのノードタイプ350と関連づけられたベースサイズ値360と1つ以上のコンテント依存値の和である。各コンテント依存値は、そのノードタイプ350のコンテントのタイプのコンテントサイズ値362と、可変サイズノードエントリー252と関連づけられた定義ノード210が有するコンテントの量との積を表す。コンテントは、その定義ノード210の子定義ノード210、または関連づけられたノードエントリー252のサイズに影響するその他の適当なコンテントを表す。
例えば、この実施形態において、名前空間ノードと関連づけられたノードエントリー252は、以下のサイズ値を有する:ベースサイズ値360、関連づけられた名前空間定義ノード210中に定義された各エレメントに対する第1のコンテントサイズ値362、関連づけられた名前空間定義ノード210中に定義された各属性に対する第2のコンテントサイズ値362、及び関連づけられた名前空間定義ノード210中に定義された各タイプに対する第3のコンテントサイズ値。このように、ベースサイズ値360を8バイトと仮定し、第1のコンテントサイズ値362を1バイトと仮定し、第2のコンテントサイズ値362を1バイトと仮定し、第3のコンテントサイズ値362を2バイトと仮定した場合、5つのエレメント、15の属性、及び4つのタイプが定義された名前空間定義ノード210と関連づけられたノードエントリー252のコンテントサイズ値は、次のようになる:
コンテントサイズ値=(1*5)+(1*15)+(2*4)=28バイト。
さらにまた、名前空間値のベースサイズ値360が10バイトの場合、この例の名前空間の可変サイズは28+10=38バイトとなる。このように、未コンパイルスキーマ80により形成された名前空間定義ノード210と関連づけられた、5つのエレメント、15の属性、4つのタイプが定義されたノードエントリー252のサイズは、38バイトである。
結果として、1つのノードエントリー252が可変サイズノードエントリー252であるとの判断に応じて、処理コンポーネント300は、サイズテーブル310またはデータ処理システム10中のその他の適当な情報にアクセスすることにより、そのノードエントリー252のサイズを決定し、その関連づけられた定義ノード210のノードタイプのベースサイズ値360と1つ以上のコンテントサイズ値362を決定する。処理コンポーネント300は、ノードエントリー252に含まれる1つ以上のタイプのコンテントの量を決定する。コンテント量を決定した後、処理コンポーネント300は、1つのタイプのコンテントの量にそのタイプのコンテントのコンテントサイズ値を乗じることにより、1つ以上のコンテント依存サイズ値を決定する。処理コンポーネント300は、ノードエントリー252に含まれる各コンテントタイプについてベースサイズ値360とコンテント依存サイズ値を加えることにより、可変サイズノードエントリー252のサイズを計算する。
また、データ処理システム10の一実施形態において、グループエントリー254等のグループノードと関連づけられたノードエントリー252は、上述のように、ノードアレイ250中の1つ以上の状態デリゲーションテーブル270を参照する。データ処理システム10の一実施形態において、状態デリゲーションテーブル270は、ノードアレイ中の関連づけられた状態デリゲーションテーブル270のサイズを指示する明示的サイズ値290を含む。このように、その状態デリゲーションテーブル270に記憶された明示的サイズ値290にアクセスすることにより、ノードアレイ250中の状態デリゲーションテーブル270のサイズを決定することができる。
第1のノードエントリー252aのサイズを決定した後、処理コンポーネント300は、ノードアレイ250中の第1のノードエントリー252aの直後のノードエントリー252bと関連づけられたインデックス370bを計算する。特に、処理コンポーネントは、ノードアレイ250中の次のノードエントリー252bを見つけるためのインデックス370bとして第1のノードエントリー252aのサイズを使用するか、または第1のノードエントリー252aのインデックス370aに第1のノードエントリー252aのサイズを加えて、次のノードエントリー252bのインデックス370bを決定する。処理コンポーネント300は、矢印372bで示したように、次のノードエントリー252bにアクセスする。処理コンポーネント300は、上記のプロセスを繰り返し、次のノードエントリー252c−dのサイズを決定し、次のノードエントリー252bに続くノードエントリー252c−dのインデックス370c−dを計算し、矢印372c−dに示したようにノードエントリー252c−dにアクセスする。結果として、処理コンポーネント300は、この方法を用いて、ノードアレイ250の各ノードエントリー252に順次アクセスすることができ、ノードアレイ250内の各ノードエントリー252または選択されたノードエントリー252に操作を加える。例えば、コンパイル済みスキーマ85が新しい記憶場所に移された場合、処理コンポーネント300は、ノードアレイ250の各ノードエントリー252中のポインターを修正して、コンパイル済みスキーマ85の新しい記憶場所を反映させる。
このように、処理コンポーネント300は、上記の方法により、データ処理システム10の一部の実施形態中のノードエントリー252に順次アクセスすることができる。処理エレメント300は、順次アクセスにより、未コンパイルスキーマ80に階層的にアクセスする場合と比べて速く、関連づけられた未コンパイルスキーマ80の各定義ノード210へのアクセスを含むような一定の動作を実行することができる。結果として、順次アクセスにより処理コンポーネント300の動作速度が速くなる。
さらにまた、ノードエントリー252に順次アクセスすることにより、処理コンポーネント300は問題のノードエントリー252の各子にアクセスするので、ノードエントリー252に2回以上アクセスすることになる。これにより、処理コンポーネント300がノードエントリー252に操作を繰り返し実行すると望ましくない結果となる。このように、順次アクセスにより、処理コンポーネント300がノードエントリー252にすでにアクセスしたかどうかを決定する必要が無くなるので、タスクの計算上の複雑さが軽減される。
図4Aは、データ処理システム10の一実施形態により利用されるデータ文書70の内容を示している。データ文書70は複数のデータノード90を含む。データノード90は、マークアップ言語データオブジェクト、エレメント、その他の構造を表す。図示した実施形態において、データノード90はXML構造を表す。データノード90はその他のデータノード90を含んでもよい。例示を目的として、データノード90aは、データノード90d−fを含み、一方、データノード90bはデータノード90g−kを含む。上で留意したように、図4Aないし4Cは、XMLデータ文書70を使用するデータ処理システム10の一実施形態に焦点を絞っているが、処理システム10の実施形態はいかなる好適なマークアップ言語により構造化されたデータ文書70を使用するものであってもよい。
データノード90には、テキスト開始デリミタ410が含まれる、またはテキスト開始デリミタ410が先行する。さらにまた、データノード90には、テキスト終了デリミタ420が含まれる、またはテキスト開始デリミタ420が後に続く。テキスト開始デリミタ410とテキスト終了デリミタ420は、それぞれ、データノード90の始めまたは終わりを示すテキストである。テキスト開始デリミタ410とテキスト終了デリミタ420は、これらのデリミタが区切るデータノード90の一部を表し、データノード90の内容とは完全に区別されたテキストを表す。一実施形態において、テキスト開始デリミタ410とテキスト終了デリミタ420は、それぞれXMLの開始及び終了タグを表す。
また、テキスト開始デリミタ410及び/またはテキスト終了デリミタ420は、関連づけられたデータノード90のノードタイプを指示する。一実施形態において、テキスト開始デリミタ410とテキスト終了デリミタ420は、関連づけられたデータノード90のノードタイプを指示するテキスト識別子264を含む。ジェネリックエンコーダ30は、データノード90のテキスト識別子264を用いて、データノード90と関連づけられたノードエントリー252をノードアレイ250中に特定する。詳細は図4Bを参照して説明する。
図4Bは、一実施形態によるジェネリックエンコーダ30の動作と内容を示す図である。データ処理システム10の実施形態において、結合アプリケーション390とともにジェネリックエンコーダ30を使用して、コンパイル済みスキーマ85に基づきデータ文書70を符号化して、データ文書70により保持される情報量を減らす。特に、XMLその他のマークアップ言語を利用して、人間が読んで意味が分かるデータ文書70を生成するので、受信アプリケーション60の観点からは余分な情報が含まれていることが多い。このように、ジェネリックエンコーダ30は、標準XML文書を受け取り、このXML文書中のデータノード90を指定されたXMLスキーマに結合し、各データノード90のために保持される情報量を減らす。上で述べたように、データ文書70に格納される情報量を減らすことにより、受信アプリケーション60をサポートするのに必要な記憶容量、及び/またはデータ文書70にアクセス、記憶、及び/または処理するための時間量を減らす。
ジェネリックエンコーダ30は、データ文書70を受け取り、このデータ文書中のデータノード90を符号化する。そのプロセスにおいて、ジェネリックエンコーダ30は、結合アプリケーション390を用いて、コンパイル済みスキーマ85のノードを結合する。図1を参照して説明したように、ジェネリックエンコーダ30は、データ処理システム10内の物理的コンポーネントを表すか、データ処理システム10で実行されているソフトウェアを表すか、またはその他の好適なソフトウェア及び/またはハードウェアの集まりを含む計算資源または処理資源を表す。
結合アプリケーション390は、スキーマコンパイラ40、メモリ100、またはデータ処理システム10の他の適当なエレメントからコンパイル済みスキーマ85を受け取り、ジェネリックエンコーダ30及び/またはデータ処理システム10の他のエレメントから受け取った結合要求に応じて、そのコンパイル済みスキーマ85と関連づけられたデータ文書70のデータノード90を結合する。結合アプリケーション390は、データ処理システム10内の物理的コンポーネント、データ処理システム10上で実行されているソフトウェアプロセス、及び/またはその他の計算または処理資源を表す。データ処理システム10の実施形態において、結合アプリケーション390はバーチャルマシンを有し、このバーチャルマシンは、データ処理システム10の他のエレメントとインターラクションする1つ以上のアプリケーションプログラミングインターフェイス(API)をサポートする。ジェネリックエンコーダ30及び/またはデータ処理システム10の他のエレメントは、これらのAPIを用いて、結合要求を結合アプリケーション390に送り、結合応答を結合アプリケーション390から受け取る。詳細は以下に説明する。また、結合アプリケーション390とジェネリックエンコーダ30は、図示したように、物理的に離散的なコンポーネントまたは別個のソフトウェアプロセスを表し、または上述の両方のエレメントの機能を提供する単一のコンポーネントまたはプロセスを表す。
ジェネリックエンコーダ30は、動作中、生成アプリケーション20からデータ文書70を受け取るか、またはデータ文書70にアクセスする。ジェネリックエンコーダ30はデータ文書70を解析する。ジェネリックエンコーダ30がデータ文書70を分析を進めていくと、テキスト開始デリミタ410とテキスト終了デリミタ420が現れる。テキスト開始デリミタ410とテキスト終了デリミタ420は、データ文書70に含まれる個別のデータノード90の始めと終わりをそれぞれ表している。ジェネリックエンコーダ30は、データノード90の始めを検知すると、そのデータノード90を特定した結合要求を結合アプリケーション390に送る。結合要求は、テキスト開始デリミタ410に含まれる、XMLタグ等のテキスト識別子264によりデータノード90を特定する。一実施形態において、ジェネリックエンコーダ30は、結合アプリケーション390にサポートされた一組のJava(登録商標)メソッドstartElement()とstartAttribute()を用いて結合要求を実行する。これらのメソッドは、パラメータとしてXMLエレメントとアトリビュートを表すデータノード90のテキスト識別子264を受け取り、コンパイル済みスキーマ85中のそのテキスト識別子264と関連づけられた定義ノード210の数値識別子450を返す。例えば、図3Aに示したデータ文書70を用いて、ジェネリックエンコーダ30は、図4Aのデータノード90bのテキスト開始デリミタ「<TITLE>」に遭遇すると、startElement()メソッドを次のように呼び出してデータノード90bを結合する:
startElement(“TITLE”)
このメソッドの呼び出しと関連づけられた結合要求を受け取ると、結合アプリケーション390は、コンパイル済みスキーマ85のノードアレイ250にアクセスしてそのテキスト識別子264と関連づけられたノードエントリー252を特定する。より具体的には、結合アプリケーション390は、階層的または順次に、ノードアレイ250と名前アレイ260にアクセスして、テキスト識別子264とマッチするストリングを含む名前エントリー262(「マッチした名前エントリー」)を探す。マッチした名前エントリーは、それに関連づけられたノードエントリー252(「マッチしたノードエントリー」)を特定する情報を含む。例えば、一部の実施形態において、各名前エントリー262は、その名前エントリー262と関連づけられたノードエントリー252(図4Bの矢印272で示す)を特定するポインターを含む。上記の実施形態において、結合アプリケーション390は、テキスト識別子264をマッチした名前エントリーとマッチすることにより、マッチング名前エントリー262を決定し、マッチした名前エントリーに含まれたポインターに従ってマッチしたノードエントリーを特定してもよい。
マッチしたノードエントリー252に含まれる情報に基づいて、結合アプリケーション390は、そのマッチしたノードエントリー252と関連づけられた数値識別子450を特定する。一部の実施形態において、ノードエントリー252は数値識別子フィールドを含み、数値識別子450はマッチしたノードエントリー252の数値識別子フィールドの値を表す。結合アプリケーションは、ジェネリックエンコーダ30に数値識別子を返す。例えば、ノード90bのテキスト識別子264(この場合「TITLE」)に対する結合要求の受け取りに応じて、結合アプリケーション390は、そのテキスト識別子と関連づけられた数値識別子450(この場合「40」)を指定する応答を送る。
ジェネリックエンコーダ30は、テキスト識別子264をそのデータノード90と関連づけられた数値識別子450と置換する符号化ノード460を生成する。ジェネリックエンコーダ30は、データノード90の内容の分析を係属し、データノード90を特定から分析した情報を符号化ノード460に加える。ジェネリックエンコーダ30は、データノード90の子ノードの始めを示すテキスト開始デリミタ410を分析した場合、上記のプロセスをこの子ノードにも繰り返す。
また、一部の実施形態において、ノードアレイ中のノードエントリー252は、そのノードエントリー252の子と関連づけられた他のノードエントリー252があれば、それを特定する。上記の実施形態において、結合アプリケーション390は、ジェネリックエンコーダ30により完了された分析に関する状態情報を保持する。特に、結合アプリケーション390は、現在分析されているデータノード90と関連づけられたノードエントリー252を特定する情報を保持する。上記の実施形態において、結合アプリケーション390は、後続の結合要求のテキスト識別子264とノードアレイ250中のノードエントリー252とのマッチを試みるとき、テキスト識別子264が現在処理されているデータノードの子と関連づけられていると仮定して、その前にマッチされたノードエントリー252の子と関連づけられたノードエントリー252のみとテキスト識別子264をマッチするよう試みる。
さらにまた、ジェネリックエンコーダ30は、データノード90bの終わりまたはデータノード90bの子ノードを特定するテキスト終了デリミタ420を分析するとき、テキスト終了デリミタ420に含まれたXMLタグ等のテキスト識別子264によりデータノード90を特定する他の結合要求を送ることにより、データノード90bの結合を完了する。一実施形態において、ジェネリックエンコーダ30は、結合アプリケーション390にサポートされた他のJava(登録商標)メソッドendElement()を用いて結合要求を実行する。これらのメソッドは、パラメータとしてXMLエレメントとアトリビュートを表すデータノード90のテキスト識別子264を受け取り、コンパイル済みスキーマ85中のそのテキスト識別子264と関連づけられた定義ノード210の数値識別子450を返す。例えば、図3Aに示したデータ文書70を用いて、ジェネリックエンコーダ30は、図4Aのデータノード90bのテキスト終了デリミタ「<TITLE>」に遭遇すると、endElement()メソッドを次のように呼び出してデータノード90bの結合を終了する:
endElement(“TITLE”)
結合アプリケーション390は、startElementメソッドを用いて生成した結合要求を参照して上で説明したのと同様の方法を用いて、結合要求に含まれたテキスト識別子264をノードアレイ250中のノードエントリーーとマッチさせることを試みる。一部の実施形態において、結合アプリケーション390は、ジェネリックエンコーダ30により実行された分析と関連づけられた状態情報を保持する。上記の実施形態において、結合アプリケーション390は、endElement()メソッドを用いて結合要求を受け取ったとき、startElement()の最も最近の呼び出しの結果として受け取ったノードエントリー252とのみその結合要求のテキスト識別子264をマッチするよう試みる。上述のように、結合アプリケーション390は、endElement()をマッチしたノードエントリーとマッチさせた後、マッチしたノードエントリーに格納された通知識別子450を返す。あるいは、結合アプリケーション390が状態情報を保持するデータ処理システム10の一部の実施形態において、ジェネリックエンコーダ30は、現在処理されているデータノード90の範囲を正確に示すためだけにendElement()を用いてもよい。上記の実施形態において、結合アプリケーション390は、状態情報を更新して、endElement()の呼び出しに応じてジェネリックエンコーダ30が現在処理されているデータノード90の終わりに到達したことを示し、デフォルト値を返すか、まったく値をかえさない。
ジェネリックエンコーダ30は、データ文書70を分析する際、データノード90を符号化するための追加的ステップを実行する。例えば、一部の実施形態において、ジェネリックエンコーダ30はデータ文書70に含まれたデリミタ数を減らす。ジェネリックエンコーダ30は、データ文書70のフォーマットに関する一定の仮定をして、標準XMLフォーマットにある内在的冗長性を利用することにより、符号化文書72のサイズをさらに減らしてもよい。一部の実施形態において、ジェネリックエンコーダ30は、結合アプリケーション390から数値識別子450を受け取った後、関連するデータノード90の情報から符号化ノード460を生成する。データノード90から符号化ノード460を生成する際、ジェネリックエンコーダ30は、データノード90の始めを示しているテキスト開始デリミタを数値デリミタ470で置き換える。符号化モジュール450は、数値デリミタ470と関連づけられたデリミタタイプ、データノード90と関連づけられた数値識別子450、及び/または所定のデリミタ値に基づき、数値デリミタ470の値を決定する。一実施形態において、スペシフィックエンコーダ35は、所定のデリミタ値を取得するためにメモリ100に格納されたデリミタ値テーブル610にアクセスする。デリミタ値テーブル610は、スペシフィックエンコーダ35が数値デリミタ470を生成するために使用する複数のデリミタ値を含む。図示した実施形態において、これらのデリミタ値はベースデリミタ値620、デリミタリミット値630、オフセット値640、及びテキストデリミタ値660を含む。
ジェネリックエンコーダ30がどのように符号化ノード460中のデリミタの数を減らすかの例として、ジェネリックエンコーダ30は、符号化ノード460中の不要な終了デリミタを削除する。XMLその他のマークアップ言語は、XMLアトリビュートやその他の簡単な内容のエレメントの終わり等に、そのデータノード90の内容に基づいて、関連づけられたデータノード90の終わりが仮定できるような状況にある終了デリミタを含む。より具体的に、ジェネリックエンコーダ30は、データノード90のノードタイプに基づき、データノード90の終わりを示す数値デリミタ470を含むかどうか判断する。例えば、XMLアトリビュートまたはシンプルコンテントエレメントと関連づけられた符号化ノード460は終了デリミタを含まない場合がある。ジェネリックエンコーダ30は、データノード90のノードタイプに基づき、符号化ノード460の終わりを示すデリミタを含めると決定すると、ジェネリックエンコーダ30は、ベースデリミタ620と等しい第2の数値デリミタ470(例えば、この実施例では−12)を含める
ジェネリックエンコーダ30は、データ文書70中の隣接する終了デリミタも結合する。例えば、図4Aに示したデータノード90とそのデータノード90の最後の子ノードの間の終了デリミタや、テキスト開始デリミタ410とテキスト終了デリミタ420の間の終了デリミタを結合する。より具体的に、ジェネリックエンコーダ30は、ベースデリミタ値620から数値デリミタ470に連結すべき第1のデリミタを超える別の各テキスト終了デリミタ420に対して1ずつデクリメントしたのと等しい関連する数値デリミタ470を用いて、複数のテキスト終了デリミタ420に対して単一の数量デリミタ470を生成する。このように、ジェネリックエンコーダ30は、2つの隣接した終了デリミタを結合するとき、2つのテキスト終了デリミタ420を単一の数量デリミタ470で置き換える。この場合、(−12−1)、または−13である。結果として、符号化ノード460の数量デリミタ470の値は、この数量デリミタ470が複数の符号化ノード460の終わりを示すことを反映している。
また、ジェネリックエンコーダ30は、テキスト終了デリミタ420とそれに隣接するテキスト開始デリミタ410と(例えばテキスト終了デリミタ420cとテキスト開始デリミタ410d)を結合する。より具体的には、ジェネリックエンコーダ20は、1つの符号化ノード460の終わりと次の符号化ノード460の始めの両方を示す符号化文書72の数量デリミタ470を生成することにより、テキスト終了デリミタ420とそれに隣接するテキスト開始デリミタ410とを連結する。一実施形態において、上記の数値デリミタ470に使用される値は、次の符号化ノード460の数値識別子450とオフセット値640との和である。
一実施形態において、このオフセット値640がデータ処理システム10の1つ以上のコンポーネントにより認識される最小の整数値であるように、ジェネリックエンコーダ30が構成される。図示した実施形態において、このオフセット値は2-31である。このように、この例では、ジェネリックエンコーダ30は、テキスト終了デリミタ420cとテキスト開始デリミタ410dをデータノード90の数値識別子450とオフセット値の和である135+2-31で置き換える。
デリミタを減らすのに加えて、ジェネリックエンコーダ30は、符号化文書72のサイズを小さくしたり、その他の適当な理由のために、他の好適なやり方でデータノードを符号化する。一実施形態において、ジェネリックエンコーダ30は、全てのテキストデータノード90を8ビットUTF−8バイトシーケンス等のバイトシーケンス490に変換する。一般的に、ジェネリックエンコーダ30は、データノード90に適当な追加的符号化ステップを実行して、符号化ノード460を生成する。符号化を完了した後、ジェネリックエンコーダ30は、符号化ノード460を含む1つ以上の符号化文書72を生成する。さらにまた、一実施形態において、データ文書70は、タグとテキストエレメントで構成されたXMLエレメントを含むXML文書である。結果として、上記の実施形態において、符号化文書72は、数値デリミタ470により区切られた一連のUTF−8バイトシーケンスを表す。ジェネリックエンコーダ30は、符号化文書72を文書デコーダ50に送り、両方のコンポーネントからアクセス可能なメモリ100に符号化文書72を格納するか、その他の適当なやり方で、文書デコーダ50が使用できるように符号化文書72を作る。
ジェネリックエンコーダ30は、テキスト識別子264を数値識別子420で置き換えて、デリミタを削除することにより、データ文書70に格納されている冗長な情報の量を選らす。結果として、ジェネリックエンコーダ30は、データ文書70のサイズをさらに減らすことができ、記憶容量を節約できるというメリットがある。また、ジェネリックエンコーダ30は、一部の実施形態において、データ文書70を符号化する追加的符号化ステップを実行する。
図4Cは、図4Aに示したデータ文書70から符号化モジュール382の実施形態により生成された符号化文書72を示す図である。図示したように、符号化文書72は、UTF−8バイトシーケンスとしてフォーマットされた複数のテキストストリングを区切る一連の10進数値デリミタ470を含む。また、複数の10進数値デリミタ470と複数のバイトシーケンスは、コンマで互いに区切られている。しかし、一般的に、数値デリミタ470とバイトシーケンス490は、コンマや改行により区切られてもよいし、その他の好適な方法であればどんな方法でもよい。あるいは、符号化文書72は、要求に応じて他のコンポーネントに出力される値のストリングを表してもよく、符号化文書72は値の間にセパレータを含んでいなくてもよい。
この符号化文書72を生成する符号化モジュール382の実施形態は、終了デリミタ値−12を使用すると仮定する。さらにまた、符号化モジュール382は、符号化モジュール382が認識できる最も小さい数値である2−31を関連するデータノード90と関連づけられた数値識別子450に加えることにより、隣接するテキスト終了デリミタ420とテキスト開始デリミタ410を置き換える中間数値デリミタ470を形成すると仮定する。図4Cで使用したように、UTF(xxx)という表示は、アスキー文字列「xxx」をUTF−8フォーマットに変換することにより生成されたバイトシーケンスを表すことを意図している。
図5A−5Bは、一実施形態によるスペシフィックエンコーダ35の動作と内容を示す図である。一部の実施形態において、スペシフィックエンコーダ35は、データ文書70を符号化する代替的または補助的方法をサポートする。生成アプリケーション20は、スペシフィックエンコーダ35とともに動作しているとき、1つ以上の結合前文書78を生成するように構成されている。結合前文書78の例は図5Aに示されている。スペシフィックエンコーダ35は、結合前文書78を符号化し、例えば、文書デコーダにより復号させるため、それをリモートコンポーネントに送る。
図5Aは、生成アプリケーション20bにより生成された結合前文書78の例を示す。特に、生成アプリケーション20bは、結合前ノード500に含まれる結合前文書78を生成する。結合前ノード500は、生成アプリケーション20aにより生成されたデータ文書70のデータノード90に含まれているデータと同様のデータを含むが、しかし、生成アプリケーション20bは、文書デコーダ50もコンパイル済みスキーマ85にアクセスする結果として冗長であるかまたは不必要となる情報を省略する。結果として、スペシフィックエンコーダ35は、ジェネリックエンコーダ30がデータ文書70を符号化するよりも速く、結合前文書78を符号化することができる。しかし、生成アプリケーション20はコンパイル済みスキーマ85に限定されているので、スペシフィックエンコーダ35はジェネリックエンコーダ30よりもローバストでないかも知れない。
図5Bは、スペシフィックエンコーダ35が結合前文書78を符号化する際の、スペシフィックエンコーダ35の一実施形態の動作を示す図である。図1を参照して上で説明したように、スペシフィックエンコーダ35は、生成アプリケーション20から結合前文書78を受け取るか、または結合前文書78にアクセスする。結合前文書78は、生成アプリケーション20がこれらのノードを生成するときにコンパイル済みスキーマ85に結合される結合前ノード500を含む。生成アプリケーション20と文書デコーダ50はコンパイル済みスキーマ85にアクセスできるので、生成アプリケーション20は、コンパイル済みスキーマ85により提供される情報を考慮して冗長または不必要な結合前ノード500及び/または結合前文書78から一部の情報を省略することができる。一実施例において、生成アプリケーション20は、データノード90に同様のやり方で結合前ノード500を生成するが、各結合前ノード500に対してテキスト識別子ではなく、数値識別子420を用いる。上記の実施形態において、文書デコーダ50またはデータ処理システム10の他のコンポーネントは、数値識別子420を解決して結合前ノード500のノードタイプを決定し、コンパイル済みスキーマ85からその結合前ノード500に関するより多くの情報を取得する。生成アプリケーション20も、上述のデリミタ削減方法及び/または結合前ノード500または結合前文書78のサイズを減らす用に設計されたその他の方法を使用してもよい。
結合前文書78を生成した後、生成アプリケーション20は、その結合前文書78をスペシフィックエンコーダ35に送るか、または供給する。スペシフィックエンコーダ35は、結合前文書78を符号化して、符号化文書72bを生成する。一実施形態において、スペシフィックエンコーダ35は、ジェネリックエンコーダ30がノード600を結合した後、ジェネリックエンコーダ30について上で説明したのと同様に結合前文書78を符号化する。例えば、スペシフィックエンコーダ35は、ジェネリックエンコーダ30について上で説明したのと同様に、デリミタ低減及び/またはUTF−8変換を実行する。一部の実施形態において、符号化文書72bは、スペシフィックエンコーダ35により生成された符号化文書72aと同様か、または同一である。より具体的には、一部の実施形態において、符号化文書72aは、図示したように、数値デリミタ470により区切られた一連のバイトシーケンスを含む。結合前文書78の符号化の後、ジェネリックエンコーダ30は、符号化ノード460を含む1つ以上の符号化文書72を生成する。スペシフィックエンコーダ35は、符号化文書72bを文書デコーダ50に送り、両方のコンポーネントからアクセス可能なメモリ100に符号化文書72bを格納するか、その他の適当なやり方で、文書デコーダ50が使用できるように符号化文書72bを作る。
生成アプリケーション20は、上述の状況では、コンパイル済みスキーマ85に関する情報を有しており、コンパイル済みスキーマ85により提供された情報(例えば、データノード90の名前のテキスト識別子264)の複製を制限することができるので、スペシフィックエンコーダ35は、ジェネリックエンコーダ30がデータノード90を結合し符号化するよりも速く結合前文書78を符号化できる。結果として、生成アプリケーション20とスペシフィックエンコーダ35の実施形態は、さらに速度というメリットを提供する。また、結合前文書78が含む情報はデータ文書70よりも少ないので、好適に構成された生成アプリケーション20とともにスペシフィックエンコーダ35を使用することにより、生成アプリケーション20から出て行くトラフィックが減少する。
図6は、一実施形態による文書デコーダ50の動作と内容を示す図である。図6は、一実施形態による文書デコーダ50の動作を示す図である。文書デコーダ50は、符号化文書72を受け取り、コンパイル済みスキーマ85を用いて、符号化文書72に含まれた符号化ノード460を復号する。文書デコーダ50は、受信アプリケーション50に復号したデータノード90を送る。文書デコーダ50は、復号中にコンパイル済みスキーマ85に含まれるデータ定義210を使用するように構成されているので、一部の実施形態において、文書デコーダ50は、データ文書70とほぼ同じ情報を提供するがサイズは小さい符号化文書72の使用を容易にする。また、文書デコーダ50は、上述のように、デリミタ低減方法を用いて符号化された符号化文書72を復号するように構成されているので、文書デコーダ50は、よりコンパクトな符号化文書72の使用を容易にする。
文書デコーダ50は、動作中に、スペシフィックエンコーダ35またはジェネリックエンコーダ30(ここでは、一般名称として「文書エンコーダ600」と呼ぶ)の一方または両方から符号化文書72を受け取る。上述の通り、符号化文書72は、値のストリーム、1つ以上のファイル、またはその他好適な構造のデータであればどんなものでもよい。結果として、符号化文書72は、図4Cに示したように、数値デリミタ470により区切られた一連のUTF−8バイトシーケンスを表す。以下の説明は、このタイプの符号化文書72に関する文書デコーダ50の動作に焦点を絞るが、文書デコーダ50は、好適な仕方で符号化された符号化文書72に関する上述の方法を使用するように構成されている。
さらにまた、文書デコーダ50は、ネットワークまたは文書処理システム10のその他の接続エレメントを介して文書エンコーダ600から符号化文書72を受け取る。さらにまた、文書デコーダ50は、符号化文書72を文書エンコーダ600から直接受け取るか、または1つ以上の仲介コンポーネントを通して受け取る。文書デコーダ50は、文書エンコーダ600と文書デコーダ50の両方によりアクセス可能なメモリ100から符号化文書72を読み出すことにより符号化文書72を受け取る。一般的に、文書デコーダ50は、データ処理システム10の文書エンコーダ600またはその他のコンポーネントから符号化文書72を受け取るか、または取得する。
文書デコーダ50は符号化文書72の分析を開始する。上述の通り、符号化文書72は、数値デリミタ470により区切られた符号化ノード460を含む。このように、符号化文書72を分析しつつ、文書デコーダは符号化文書72から数値デリミタ470を読み出す。文書デコーダ50は、数値デリミタ470を1つ以上の所定のデリミタ値と比較して、数値デリミタ470が1つ以上の符号化ノードの始めまたは終わりを示すかどうか決定する。データ文書70は、この決定に基づき、受信アプリケーション50への送信のためにマークアップデータオブジェクトを再構成し、または、例えば、そのデータノード90の属性その他の内容を文書デコーダ50のAPIを通して受信アプリケーション50に利用可能とすることにより、データノード90の内容を記述する情報を受信アプリケーション50に提供する。図示した実施形態において、文書デコーダ50は、その符号化ノード460の復号を終わるまで、符号化ノード460から復号したデータをメモリ100中の復号スタック670に格納する。文書デコーダ50は、受信アプリケーション50にそのデータから生成した復号データノード90を送る。
例えば、文書デコーダ50は、分析の際に数値デリミタ470に遭遇するたびに、その数値デリミタ470を1つ以上の所定値と比較することにより、その数値デリミタ470のデリミタタイプを決定する。一実施形態において、文書デコーダ50は、デリミタ値テーブル610にアクセスすることにより所定値を取得する。デリミタ値テーブル610は、文書デコーダ50が読み出した数値デリミタ470のデリミタタイプを決定するために使用する複数のデリミタ値を含んでいる。図示した実施形態において、これらのデリミタ値はベースデリミタ値620、デリミタリミット値630、逆オフセット値650、及びテキストデリミタ値660を含む。
文書デコーダ50は、最初に、数値デリミタ470が単一符号化ノード460の終了デリミタであるかどうか決定する。文書デコーダ50は、数値デリミタ470をベースデリミタ値620と比較することにより、数値デリミタ470が終了デリミタを表すかどうか決定する。文書デコーダ50は、図6に示したように、デリミタ値テーブル610にアクセスすることにより、ベースデリミタ値を取得するか、またはその他の適当な仕方でベースデリミタ値620を取得する。一実施形態において、文書エンコーダ600は、ベースデリミタ値620と等しい所定の数値デリミタ470を有する単一のデータノード90の終わりである全ての終了デリミタを符号化するように構成されている。一実施形態において、ベースデリミタ値620は「−12」である。このように、数値デリミタ470がベースデリミタ値620と等しい場合、文書デコーダ50は、数値デリミタ470が単一の符号化ノード460の終わりを表すと判断する。文書デコーダ50は、その構成に基づいて、適当な仕方でこの判断を使用する。例えば、一実施形態において、文書デコーダ50は、現在復号している符号化ノード460の復号データをデータノード90のスタックに加える。文書デコーダ50は、数値デリミタ470が単一の符号化ノード460の終わりを表すとの判断の結果として、スタックの一番上から現在のデータノードをポップし、このデータノード90を受信アプリケーション50に送る。文書デコーダ50は、その後、符号化文書72の残りを分析する。
関連する数値デリミタ470が単一ノードの終了デリミタを表さない場合、文書デコーダ50は、その数値デリミタ470が2つ以上のネストされた符号化ノードの終わりを示す終了デリミタであるかどうか判断する。一実施形態において、文書エンコーダ600は、複数のネストされたデータノード90の終わりを示す隣接するテキストデリミタを連結し、符号化文書72ではその隣接するテキストデリミタを連結されたデリミタにより置き換えるように構成されている。この連結されたデリミタは、ベースデリミタ値620を隣接する終了デリミタにより終わる第1のデリミタ以降の各データノード90について1回ずつデクリメントした値である。さらにまた、文書エンコーダ600は、一定の最大数の隣接する終了デリミタのみを連結するように構成されてもよい。このように、ネストされた終了デリミタの符号化においては、文書エンコーダ600は、一定の最大回数のみベースデリミタ値620をデクリメントして、隣接する終了デリミタを表す。結果として、文書デコーダ50は、一実施形態において、数値デリミタ470がベースデリミタ値620より小さいが、しかしデリミタリミット値630以上であると判断することにより、数値デリミタ470が複数のネストされた終了デリミタを表すと決定する。デリミタリミット値630は、ベースデリミタ値620から文書エンコーダ600が連結するように構成されているネストされたデリミタの最大数を引いた値である。
例えば、一実施形態において、文書エンコーダ600は、ネストされたデリミタを最大10個まで連結するように構成される。結果として、デリミタリミット値620は「−22」である。このように、上記の実施形態において、文書デコーダ50は、数値デリミタ470が「−12」より小さいが「−22」以上であると判断することにより、その数値デリミタ470が複数のネストされた符号化ノード460の終わりを示す連結されたデリミタであると判断する。
文書デコーダ50は、数値デリミタ470が複数の符号化ノード460の終わりを示すと判断した場合、この判断を適当な仕方で利用することができる。例えば、一実施形態において、文書デコーダ50は、スタックの一番上から現在データノードをポップして、このデータノードを受信アプリケーション50に送る。文書デコーダ50は、数値デリミタ470をインクリメントし、数値デリミタ470をベースデリミタ値620と再度比較する。文書デコーダ50は、数値デリミタ470がベースデリミタ値620と等しくなるまでこのプロセスを繰り返す。文書デコーダ50は、その後、符号化文書72の残りを分析する。
文書デコーダ50は、数値デリミタ470が1つ以上の符号化ノード460の終わりを表さないと判断した場合、数値デリミタ470が第1の符号化ノード460の終わりと第2の隣接する符号化ノード460の始めを表すかどうか判断する。一実施形態において、文書エンコーダ600は、符号化文書72において隣接する終了デリミタと開始デリミタを1つの中間デリミタで置き換えることにより、第1のデータノード90の始めと第2の隣接するデータノード90の終わりをそれぞれ示す隣接する終了デリミタと開始デリミタを符号化するように構成されている。一実施形態において、その中間デリミタに使用される値は、第2のノードの数値識別子とオフセット値640との和である。
上述の実施形態において、このオフセット値640は、文書デコーダ50により認識される最も小さい整数値である。上述の実施形態において、文書デコーダ50は、2の補数計算を使用するように構成され、最も小さな整数値を正数に加えることにより、絶対値が比較的大きい負の整数になる。このように、文書デコーダ50は、一実施形態において、数値デリミタ470がデリミタリミット値630より小さいかどうか判断することにより、数値デリミタ470が第1の符号化ノード460の終わりとそれに隣接する符号化ノード460の始めを示す連結デリミタを表すと判断する。
文書デコーダ50は、数値デリミタ470が第1の符号化ノード460の終わりと第2の隣接する符号化ノード460の始めを示すと判断した場合、この判断を適当な仕方で利用することができる。例えば、一実施形態において、文書デコーダ50は、スタックの一番上から現在のデータノード90をポップして、このデータノードを受信アプリケーション50に送る。文書デコーダ50は、逆オフセット値650を数値デリミタ470に加えることにより、新しいデータノード90の数値デリミタ470を計算する。一実施形態において、この逆オフセット値650は、文書デコーダ50により認識される最大の整数値である。図示した実施形態において、この逆オフセット値650は231である。逆オフセット値650を数値デリミタ470に加えることにより、文書デコーダ50は、第2の符号化ノード460と関連づけられた元の数値デリミタ470を回復することができる。文書デコーダ50は、コンパイル済みスキーマ85中で、元の数値デリミタ470と関連づけられた定義ノード210を特定する。文書デコーダ50は、新しいデータノード90を復号スタック670の一番上にプッシュする。文書デコーダ50は、他の数値デリミタ470を読むとき、上述のプロセスを繰り返して符号化文書72の分析を続ける。
文書デコーダ50は、数値デリミタ470がベースデリミタ値620より大きいと判断した場合、その数値デリミタ470がミックスコンテントデータノード90の符号化テキストの始めを示すかどうか判断する。一実施形態において、文書エンコーダ600は、ミックスコンテントデータノード90のテキストの始めをテキストデリミタ値660と等しいデリミタで示すように構成されている。図示した実施形態において、テキストデリミタ値660は「−1」である。このように、上述の実施形態において、文書デコーダ50は、数値デリミタ470がテキストデリミタ値660と等しいと判断することにより、その数値デリミタ470がミックスコンテントデータノード90のテキストの始めを示すと判断する。
文書デコーダ50は、数値デリミタ470が符号化テキストの始めを示すと判断した場合、この判断を適当な仕方で利用することができる。一実施形態において、文書デコーダ50は、符号化文書72からのデータの読み出しと、このデータの文字への復号を開始する。例えば、文書デコーダ50は、UTF−8バイトシーケンスを読み出し、このバイトシーケンスをASCIIテキスト文字に復号する。文書デコーダ50は、これらの文字を受信アプリケーション50に送り、文書デコーダ50が現在復号しているデータノード90の復号スタック670にその文字を格納する。文書デコーダ50は、このテキストアイテムと関連づけられた全てのデータを読み出したと判断すると、数値デリミタ470の分析に戻る。一実施形態において、文書デコーダ50は、全てゼロのバイトシーケンスを検知することにより、このオブジェクトの全てのテキストを読み出したと判断する。テキストアイテムの全ての文字を読み出した後、文書デコーダ50は数値デリミタ470の分析に戻る。
また、文書デコーダ50は、数値デリミタ470がベースデリミタ値620より大きいが、テキストデリミタ値660と等しくないと判断した場合、数値デリミタ470が前の符号化ノード460の直後ではない符号化ノード460の始めを示す開始デリミタを示すと判断する。一実施形態において、文書エンコーダ600は、図4Bを参照して説明したように、開始デリミタを関連するデータノード90と関連づけられた数値デリミタ470と置き換えることにより、終了デリミタの直後には続かない開始デリミタを符号化するように構成されているこのように、一実施形態において、文書デコーダ50は、数値デリミタ470がベースデリミタ値620より大きいがテキストデリミタ値660とは等しくない場合、その数値デリミタ470が符号化ノード460の初めを表すと判断する。
文書デコーダ50は、数値デリミタ470が符号化ノード460の始めを示すと判断した場合、この判断を適当な仕方で利用することができる。一実施形態において、文書デコーダ50は、コンパイル済みスキーマ85のノードアレイ250の数値デリミタ470と関連づけられたノードエントリー252を特定する。データ文書70は、特定されたノードアレイ250中の参照244に基づき識別されたノードエントリー252と関連づけられた名前アレイ260の名前エントリー262を特定する。
さらにまた、文書デコーダ50は、符号化ノード460がシンプルノードタイプのデータノード90を表すと、特定されたノードエントリー252に基づき判断した場合、符号化ノード460のノードタイプと関連づけられたテキスト名672等の名前エントリー262からの情報を含む新しいデータ構造690を生成する。データ構造690は、オブジェクト、レコード、ストリング、アレイ、その他の好適なデータの集まりを表す。
文書デコーダ50は、そのデータ構造690を受信アプリケーションに送り、後で使用するために格納する。 文書デコーダ50は、符号化ノード460がコンプレックスノードタイプのデータノード90を表すと、特定されたノードエントリー252に基づき判断した場合、符号化ノード460のノードタイプと関連づけられたテキスト名672等の名前エントリー262からの情報を含むデータ構造690を生成し、そのデータ構造690を復号スタック670にプッシュする。 文書デコーダ50は符号化文書72の分析に戻る。
文書デコーダ50は、上述の比較を繰り返して符号化文書72の終わりに到達するまで、符号化文書72の分析を続ける。また、データ文書70は、上述の通り、符号化文書72の復号の前、または後に、追加的前処理または後処理のステップを実行してもよい。さらにまた、文書デコーダ50は、符号化文書72の特徴と文書デコーダ50の構成に基づき、上述の処理の際に追加的ステップを適宜含めてもよい。文書デコーダ50は、一旦符号化文書72の分析を完了すると、データ文書70をメモリ100のデータノード90に格納し、そのデータノード90を受信アプリケーション50に送り、文書デコーダ50が符号化文書72の復号を完了したことを受信アプリケーションに通知し、及び/またはデータ処理システム10の構成に基づいてその他の適当なステップを実行する。あるいは、文書デコーダ50が復号の際データノード90を受信アプリケーション50に送っている場合、文書デコーダ50は受信アプリケーション50には何も通知せずに終了してもよい。
図7Aと7Bは、図6に示した実施形態による、文書デコーダ50の動作を詳しく示すフローチャートである。ステップ1100において、文書デコーダ50は符号化文書72の分析を開始する。ステップ1110において、符号化文書72を分析しつつ、文書デコーダ50は符号化文書72から最初の数値デリミタ470を読み出す。ステップ1120において、文書デコーダ50は、最初の数値デリミタ470と関連づけられたコンパイル済みスキーマ85中の定義ノード210を特定する。ステップ1130において、文書デコーダ50は、新しいデータ構造690を復号スタック670に生成する。文書デコーダ50は、特定された定義ノード210と関連づけられたテキスト識別子264をデータ構造690に格納する。ステップ1140において、文書デコーダ50は、符号化文書72中の最初の数値デリミタ470に続くデータの分析を続け、このデータを符号化フォーマットから復号フォーマットに変換する。例えば、文書デコーダ50は、そのデータをUTF−8バイトシーケンスからASCII文字に変換する。ステップ1150において、文書デコーダ50は、この復号データの一部または全部をデータ構造690の一番上に格納する。
ステップ1160において、文書デコーダ50は、符号化文書72から第2の数値デリミタ470を読み出す。文書デコーダ50は、第2の数値デリミタ470が1つ以上の符号化ノード460の終わりを示すかどうか判断する。より具体的には、文書デコーダ50は、ステップ1170において、第2の数値デリミタ470がベースデリミタ値620と等しいかどうか判断する。第2の数値デリミタ470がベースデリミタ値620と等しい場合、第2の数値デリミタ470は単一の符号化ノード460の終わりを表す。このように、第2の数値デリミタ470がベースデリミタ値620と等しいとの判断に応じて、文書デコーダ50は、符号化文書72からのデータを復号スタック670中の最上部のデータ構造690への格納を停止するか、及び/またはステップ1180において復号スタック670から最上部のデータ構造690をポップする。文書デコーダ50は、ステップ1190において、この最上部のデータ構造690を受信アプリケーション50に送る。完成したデータ構造690は、マークアップ言語データ構造または他の好適な方法で構成された情報を表す。この時点で、文書デコーダ50は符号化ノード460の内容の分析をもはやしていないので、文書デコーダ50は符号化文書72の終わりに到達したことになる。
このように、ステップ1200において、文書デコーダ50は、符号化文書72の終わりまで分析したかどうか判断する。文書デコーダ50は、ファイルの終わりを示す文字を分析することにより、符号化文書72には分析すべきデータがもはやないことを検知することにより、またはその他の好適な方法により、符号化文書72の終わりに到達したと判断してもよい。文書デコーダ50は、文書デコーダ50が符号化文書72の終わりに到達したと判断した場合、ステップ1400において復号を終了する。文書デコーダ50は、符号化文書72の終わりに到達したと判断しなかった場合、ステップ1100に戻り、符号化文書72の分析を続ける。
第2の数値デリミタ470がベースデリミタ値620と等しくない場合、文書デコーダ50は、ステップ1210において、第2の数値デリミタ470がベースデリミタ値620より小さいが、デリミタリミット値630より大きいかどうか判断する。第2の数値デリミタ470はベースデリミタ値620より小さく、デリミタリミット値630より大きい場合、第2の数値デリミタ470は複数の符号化ノード460の終わりを示す。このように、第2の数値デリミタ470がベースデリミタ値620より小さいが、デリミタリミット値630より大きいとの判断に応じて、文書デコーダ50は、符号化文書72からのデータの復号スタック670中の最上部のデータ構造690への格納を停止するか、及び/またはステップ1220において復号スタック670から最上部のデータ構造690をポップする。文書デコーダ50は、ステップ1230において、構造690を受信アプリケーション50に送る。また、文書デコーダ50は、ステップ1240において、第2の数値デリミタ470をインクリメントする。文書デコーダ50はステップ1170に戻る。
第2の数値デリミタ470がベースデリミタ値620より小さくない場合、文書デコーダ50は、ステップ1250において、第2の数値デリミタ470がテキストデリミタ値660と等しいかどうか判断する。第2の数値デリミタ470がテキストデリミタ値660と等しい場合、第2の数値デリミタ470はテキストエレメントの始めを表す。第2の数値デリミタ470がテキストデリミタ値660と等しいとの判断に応じて、文書デコーダ50は、ステップ1260において復号スタック670上に新しいデータストラクチャ690を生成する。ステップ1270において、文書デコーダ50は、符号化文書72中の第2の数値デリミタ470に続くデータの分析を続け、このデータを符号化フォーマットから復号フォーマットに変換する。ステップ1280において、文書デコーダ50は、この復号データの一部または全部をデータ構造690に格納する。文書デコーダ50は、ステップ1290において、符号化テキストエレメントの終わりに到達したと判断するまで、符号化テキストエレメントからのデータの分析を続ける。文書デコーダ50は、符号化テキストエレメントに指示されたサイズを使用することにより、符号化テキストの終わりを示す所定の文字または文字パターンを検知することにより、またはその他の好適な方法により、符号化テキストエレメントの終わりに到達したことを判断する。符号化テキストエレメントの終わりを検知した後に、文書デコーダ50は、符号化文書72からのデータを復号スタック670中の最上部のデータ構造690への格納を停止するか、及び/またはステップ1300において復号スタック670から最上部のデータ構造690をポップする。文書デコーダ50は、ステップ1310において、データ構造690を受信アプリケーション50に送る。文書デコーダ50は、ステップ1130に戻り、符号化文書72の分析を続ける。
第2の数値デリミタ470がベースデリミタ値620とデリミタリミット値630の両方より小さい場合、第2の数値デリミタ470は、第1の符号化ノード460の終わりと第2の符号化ノード460の始めを示す。結果として、文書デコーダ50は、符号化文書72からのデータを復号スタック670中の最上部のデータ構造690への格納を停止するか、及び/またはステップ1320において復号スタック670から最上部のデータ構造690をポップする。文書デコーダ50は、ステップ1330において、この最上部のデータ構造690を受信アプリケーション50に送る。
また、上記の場合、第2の数値デリミタ470は、第2の符号化ノード460と関連づけられた数値識別子450の和を表す。文書デコーダ50の図示した実施形態は2の補数計算を使用するので、文書デコーダ50は逆オフセット値650を第2の数値デリミタ470に加えることにより数値識別子450を取得することができる。このように、ステップ1340において、文書デコーダ50は逆オフセット値650を第2の数値デリミタ470に加えて数値識別子450を取得する。文書デコーダ50は、ステップ1350において、この数値識別子450と関連づけられたコンパイル済みスキーマ85の定義ノード210を特定する。ステップ1360において、文書デコーダ50は、新しいデータ構造690を復号スタック670に生成する。文書デコーダ50は、特定された定義ノード210からのテキスト識別子264をデータ構造690に格納する。ステップ1370において、文書デコーダ50は、符号化文書72中の第2の数値デリミタ470に続くデータの分析を続け、このデータを符号化フォーマットから復号フォーマットに変換する。ステップ1380において、文書デコーダ50は、この復号データの一部または全部をデータ構造690に格納する。文書デコーダ50はステップ1160に戻る。
図7A−7Bのフローチャートには必ずしも示していないが、文書デコーダ50は、適当な時に、符号化文書72からのデータを分析しながら、好適な基準に基づき、符号化文書72の終わりに到達したと判断する。例えば、文書デコーダ50は、復号スタック670上の最下部のデータ構造690の終了デリミタを検知する。あるいは、文書デコーダ50は、符号化文書72の終わりを示す、所定の文字または文字パターンを検知してもよい。しかし、一般的に、文書デコーダ50は、いかなる方法で符号化文書72の終わりに到達したことを判断してもよい。ステップ1400における符号化文書72の終わりに到達したという判断の際、文書デコーダ50は、復号スタック670から残りのデータ構造690を削除し、そのデータストラクチャ690を受信アプリケーション50に送り、及び/または符号化文書72の復号を完了する適当なステップを実行する。文書デコーダ50は、ステップ1400において復号を完了する。
図8A−8Eは、文書デコーダ50の実施形態によりサポートされた別の復号方法を示す図である。文書デコーダ50は、一定の状況下、コンパイル済みスキーマ85に結合されていない受信アプリケーション60用データ文書を受け取る。結果として、一部の実施形態において、文書デコーダ50は、1つのスキーマまたはその他のデータ定義形式に従って構成され、コンパイル済みスキーマ85には結合されていないノード(未結合ノード702と呼ぶ)の階層を含む未結合文書700を復号するように構成されている。文書状態スタック710を用いて、文書デコーダ50は、未結合文書700中のノード(未結合ノード702と呼ぶ)の階層ツリー内における文書デコーダ50の現在位置をトラックすることができる。結果として、一部の実施形態において、文書デコーダ50は、受信アプリケーション60により使用される文書の復号において大きな柔軟性を提供する。
図8Aは、文書デコーダ50の実施形態が復号可能である未結合文書700xの一例を示す図である。また、図8Aには、この例における未結合文書700xで使用される構成を規定する未コンパイルスキーマ80も示す。また、例示を目的として、図8Aには、未結合文書700xとして同じXML構成を含むが、従来のXML規則に従ってフォーマットされたデータ文書70xの一例が含まれている。
未結合文書700は、一般的に、データ処理システム10のデータ定義(未コンパイルスキーマ80など)により定義されたデータノード90を記述する文書を表す。ひとつの例として、未結合文書700は、符号化されていない標準XMLデータ文書を表す。未結合文書700は、未結合ノード702の階層がその未結合文書のデリミタに基づいて特定されるようにはマークアップ言語によりフォーマット及び/または区切られていない構造化データ文書も表す。例えば、文書デコーダ50は、一部の実施形態において、図8Aに示した未結合文書700x等のデータノード90を含むコンマ区切りフォーマット(CSV)ファイルとしてフォーマットされた未結合文書700を受け取る。また、図8Aには、未結合文書700xで使用される構成を定義する未コンパイルスキーマ80xと、未結合文書700xの情報がどのようにXMLで構成されるかを示すデータ文書70xとが示されている。
上記の例において、未結合文書700xは、エレメントインスタンスを表す複数の未結合ノード702を含む。また、図8Aでは参照符号を付していないが、未結合文書700xは、グループノード及び/またはその他のタイプの未結合ノードを表す複数の未結合ノードを含む。例えば、未結合文書700xは、エレメントD、エレメントE、及びエレメントFのインスタンスにより形成されたグループノードを含み、このインスタンスは集合的に未結合文書700xのエレメントCの第1のインスタンスとなる。
図8Aは、未結合ノード702が記号と改行の組み合わせにより区切られた、文書デコーダ50の実施形態で使用する未結合文書700xの一例を示すが、文書デコーダ50は、別の実施形態において、適当な文字、記号、空白、及び/またはその他のコンテントにより区切られた未結合文書700を使用することもできる。一般的に、未結合ノード702は適当な区切り方法により区切られてもよく、文書デコーダ50は未コンパイルスキーマ80中の情報またはその他の情報源からの情報をを使用して、未結合文書700と関連づけられた区切り方法を決定してもよい。この例において、例えば、エレメントBのインスタンスにおいては、未結合ノード702aは黙示的に新しいラインで開始して、新しいラインで終了する。エレメントCのインスタンスでは、例えば、未結合ノード702b−dも新しいラインで始まり、新しいラインで終わる。エレメントDのインスタンスでは、例えば、未結合ノード702eと702jは、「+」で始まり、「,」で終わる。エレメントEのインスタンスでは、例えば、未結合ノード702fと702hは、「:」で始まり、「:」で終わる。エレメントFのインスタンスでは、例えば、未結合ノード702g、702j、702kは、「+」で始まり、「:」で終わる。
図8Bは、未結合文書700の復号における文書デコーダ50の動作を示す図である。特に、図8Bは、図8Aにも示したコンパイル済みスキーマ85に含まれた情報に基づいて、図8Aに示された未結合文書700xを復号する文書デコーダ50の動作を示す。図8Aを参照して説明したように、図8Bは、1つのタイプの未結合文書700を復号する際の文書デコーダ50の動作を示すが、文書デコーダ50は、未コンパイルスキーマ80及び/またはその他の適当な情報源からの情報に基づいていかなる好適なタイプの未結合文書700も復号するように構成されている。文書デコーダ50に加えて、図8Bは、グラフィカルユーザインターフェイス(GUI)900と文書データスタック710とを含む。
GUI900は、以下により詳しく説明するように、未結合文書700の復号と関連づけられた情報を表示するために、文書デコーダ50により使用される。GUI900は、文書デコーダ50により送られた情報に基づき、視覚的表示を生成することができる好適なユーザインターフェイスであればどんなものでもよい。GUI900は、ハードウェア及び/またはソフトウェアの好適な組み合わせを含む。図示した実施形態において、GUI900は、コンピュータモニター910に情報を出力することができる、プロセッサ上で実行されたソフトウェアプロセスを表す。上記の実施形態において、文書デコーダ50は、GUI900が未結合文書700xの復号と関連づけられた更新された状態情報を受け取るために通信する仮想マシンを表す。
文書状態スタック710は、データ処理システム10のメモリ100に格納されたデータ構造を表す。図8Bに示したように、文書デコーダ50は文書状態スタック710にアクセスする。未結合文書700の分析の際、文書状態スタック710は、文書復号の現在の状態を追跡するために、文書デコーダ50のための適当な情報を含む状態エントリー720を保持する。文書状態スタック710は、「スタック」として説明したが、文書状態スタック710は、以下に説明するように、状態エントリー720を格納するのに好適なデータ構造であればどんな形式でもよい。一実施形態において、文書状態スタック710は、先入れ後出し(FILO)スタックである。
文書デコーダ50は、動作中、データ処理システム10のリモートコンポーネントから未結合文書700xを受け取るか、他の適当な方法で未結合文書700xを取得する。上述のように、未結合文書700xは、記号または改行で区切られた一連のテキスト値を含む。文書デコーダ50は、未コンパイルスキーマ80を用いて、XMLまたはその他の受信アプリケーション60によりサポートされたデータ文書に則したデータ文書70に未結合文書700xを変換する。
より具体的に、未結合文書700xを取得した後、文書デコーダ50は、その未結合文書700xの分析を開始する。未結合文書700xと関連づけられた区切り方法に基づき、文書デコーダ50は未結合文書700xの第1のデータノードの始めを特定する。例えば、文書デコーダ50は、第1のラインの第1の文字が未結合文書700xの第1の未結合ノード702の始まりを示すと判断してもよいし、第1の改行文字の後の第1の文字が未結合文書700xの第1の未結合ノード702の始まりを示すと判断してもよいし、特定のデリミタに続く第1の文字が未結合文書700xの第1の未結合ノード702の始まりを示すと判断してもよい。一般的に、文書デコーダ50は、未結合文書700のフォーマットに応じて、好適な方法で未結合文書700中の第1のデータノードの始まりを特定する。図示した実施形態において、文書デコーダ50は、未結合文書700xの第1の未結合ノード702aの始めとして第1のラインの第1の文字を特定する。未結合文書700xの第1の未結合ノード702aの始めを特定した結果として、文書デコーダ50は、第1のステートエントリー720aを文書状態スタック710に加える。例示した実施形態において、文書状態スタック710はFILOスタックを表し、文書デコーダ50は、文書状態スタック710の一端(ここでは「トップ」と呼ぶ)に第1の状態エントリー720aをプッシュする。
特に、文書デコーダ50が未結合ノード702のために生成する状態エントリー720の内容はそのノードのノードタイプに依存する。文書デコーダ50は、未結合文書700xと関連づけられた未コンパイルスキーマ80に基づき、関連ノード702のノードタイプを決定する。一部の実施形態において、文書デコーダ50は、関連ノード702のノードタイプに基づいて、エレメント状態エントリー720、グループ状態エントリー720、及び/またはその他のタイプの状態エントリーを生成する。関連未結合ノード702がエレメントノード702を表す場合、文書デコーダ50は、文書状態スタックのエレメント状態エントリー720を生成する。エレメント状態エントリー720は、関連ノード702と関連づけられたテキスト識別子722と、関連ノード702の内容が完全に分析されたかどうかを示すパーティクルカウント724を含む。
関連未結合ノード702がグループノード702を表す場合、文書デコーダ50は、文書状態スタック710のグループ状態エントリー720を生成する。グループ状態エントリー720は、適格であり発生として数えられる前にそのグループのインスタンスが有さねばならない子の数を示す、最小発生値726と、最大発生値728とを含む。さらにまた、関連グループノード702が複数タイプの子ノードを含む場合、グループ状態エントリー720は、そのグループノード702の子ノードの各タイプと関連づけられた最小発生値726と最大発生値728を含む。さらにまた、文書デコーダ50は、未結合文書700xに他の未結合ノード702の始めを特定した場合、特定された未結合ノード702は複数のネストされたグループノード中の第1のエレメントを表し、ネストされたグループノードごとに、複数のグループ状態エントリー720を文書状態スタック710に加える。
文書状態スタック710に状態エントリー720をプッシュした後、文書デコーダ50は、未結合文書700xの分析を続ける。文書デコーダ50は、他の未結合ノード702の始まりを示す他の開始デリミタまたは他の好適な情報を特定すると、他のエレメント状態エントリー720を文書状態スタック710に加える。図示した実施形態において、文書デコーダ50は、他の状態エントリー720を文書状態スタック710のトップにプッシュすることにより、他の状態エントリーを加える。
文書デコーダ50は、現在の未結合ノード702の終わりを示す終了デリミタまたは他の好適な情報を特定すると、最上部の状態エントリー720を文書状態スタック710から削除する。例示した実施形態において、文書デコーダ50は、文書状態スタック710のトップから状態エントリー720をポップすることにより、文書状態スタック710から状態エントリー720を削除する。結果として、文書デコーダ50は、文書状態スタック710に状態エントリー720を加えることにより、または文書状態スタック710から状態エントリーを削除することにより、文書分析の現在の状態をトラックする。
文書デコーダ50は、未結合ノード702の終了デリミタが分析されたと判断した結果、他のいかなる適当な動作を実行してもよい。例えば、文書デコーダ50は、未結合ノードと関連づけられた分析データをXMLフォーマットのファイルに書き込んでもよい。結果として、文書デコーダ50は、未結合文書700xの復号の結果として、図8Aに示したデータ文書70xと同様のデータ文書を出力する。
また、一部の実施形態において、文書デコーダ50は、関連した未結合ノード702及び/またはその未結合ノード702の子と関連づけられたパーティクルカウント724、最小発生値726、最大発生値728、及び/または発生カウント730を使用して、その未結合ノード702の受付状態を決定する。受付状態は、文書デコーダ50がその未結合ノード702の分析を完了したかどうか、及び/またはその未結合ノード702が関連マークアップ言語の適格なオブジェクトを表しているかどうかを示す。
例えば、上述したように、文書デコーダ50は、グループを含む未結合ノード702の始めを分析するとき、グループ状態エントリー720を加える。グループ状態エントリー720は、適格であると見なされる前にそのグループのインスタンスが持たなければならない子を記述する最小発生値726と最大発生地728、及びそのインスタンスに対して分析された子の現在の数を示す発生カウント730を含む。図示した例において、エレメントBのインスタンスに含まれる「選択」グループ(未結合ノード702a等)は、エレメントCの少なくとも1つの子インスタンスを含む必要があり、エレメントCのインスタンスを3つより多く含まない。このように、文書デコーダ50は、未結合文書700xを分析する際にエレメントBのインスタンスに遭遇した時、最小発生値726「1」と最大発生値728「3」を含むグループ状態エントリー722aを生成する。
そして、文書デコーダ50は、この「選択」グループの子ノード702を分析しながら、そのグループの他の子に遭遇するたびに、発生カウント730をインクリメントする。文書デコーダ50は、発生カウント730と、そのグループと関連づけられた最小発生値726及び/または最大発生値728に基づき、そのグループの受付状態を決定する。例えば、一実施形態において、文書デコーダ50は、1つのグループ未結合ノード702の3つの可能な受付状態の1つを決定する。1つのグループ状態エントリー722の発生カウント730がそのグループ状態エントリー722の最小発生値726より小さい場合、文書デコーダ50は、そのグループ状態エントリー722と関連づけられたグループノードについて受付状態が「IS_NOT_DONE」であると決定する。関連発生カウント730が最小発生値726以上である場合、文書デコーダ50は、受付状態を「ACCEPTED」と決定する。これは、文書デコーダ50は、そのグループノードを適格であると見なすのに十分な数の子を発見したが、そのグループノードは受付可能なもっと多い子を含んでいるかも知れないことを意味する。発生カウント730が最大発生値728と等しい場合、文書デコーダ50は、そのグループノードが別の子は含むことができなく、適格であることを示す受付状態「IS_DONE」を決定する。文書デコーダ50は、受付状態フィールド736として、関連するグループ状態エントリー722にこの受付状態を追加格納する。
文書デコーダ50は、文書状態スタック710の最上部の状態エントリー720の受付状態が「IS_DONE」であると判断すると、文書状態スタック710からその最上部の状態エントリー720を削除する。また、文書デコーダ50は、分析の際、文書状態スタック710の最上部の状態エントリー720と関連づけられたデータノードの終了デリミタに到達し、最上部の状態エントリーが「ACCEPTED」の受付状態を現在有する場合、その状態エントリーと関連づけられた未結合ノード702は完了したと判断し、その最上部の状態エントリーを文書状態スタック710から削除する。さらにまた、一部の実施形態において、文書デコーダ50は、受付状態と分析結果の組み合わせが予期しないものである場合、警告またはエラー訂正動作を開始する。例えば、文書デコーダ50は、グループ未結合ノード702の受付状態が「IS_DONE」となったと判断し、そのグループ未結合ノード702の他の子を分析した場合、問題の未結合ノード702は不適格であることを示す警告を生成する。
上述のように、図8Bは、文書デコーダ50がノード702gの開始デリミタ「+」を分析した直後の文書状態スタック710の内容を示している。文書デコーダ50は、エレメントCのインスタンスについて可能な子の各タイプの最大数(エレメントD、E、及びFについて1つずつ)を検知したので、ノード702bにより表されるエレメントCのインスタンスと関連づけられたグループノードはこれ以上の子を含んではならないと判断し、グループ状態エントリー220dの受付状態は「IS_DONE」になる。対照的に、文書デコーダ50は、ノード702Aにより表されるエレメントBのインスタンス内にエレメント「C」の1つのインスタンスだけを検知している。この合計はグループ状態エントリー220bの最小発生値726以上であるが、グループ状態エントリー220bの最大発生値728より小さい。このように、文書デコーダ50がエレメントBのインスタンスに十分な数の子を検知しても、そのインスタンスが未コンパイルスキーマ80xの規定にしたがってより多くの子を保持してもよい。結果として、受付状態は「ACCEPTED」となる。
また、文書デコーダ50は、未結合ノード702aと702bと関連づけられたエレメントBとCのインスタンスの内容を分析したので、これら2つのエレメント状態エントリー720のパーティクルカウント724は「1」である。文書デコーダ50は、既存のコンテントパーティクルを分析を続けるが、他にはコンテントパーティクルはないので、これらのエレメント状態エントリーの受付状態は「IS_DONE」である。対照的に、文書デコーダ50は、未結合ノード702gの開始デリミタのみを分析し、ノード702gの内容は分析していない。結果として、図8Bに示したように、関連づけられたエレメント状態エントリー720のパーティクルカウントは、「0」であり、受付状態は「IS_NOT_DONE」である。
一部の実施形態において、文書状態スタック710を更新するのに加え、文書デコーダ50は、状態エントリー720または722、及び/またはそれと関連づけられたノード702の受付状態と関連づけられた情報をGUIに表示する。一部の実施形態において、文書デコーダ50は、文書状態スタック710に現在及び/または前に格納された格状態エントリー720の状態インジケータ740を生成して、これらの状態インジケータ740をGUI900に送り、GUI900上に表示することにより、状態エントリーの受付状態を示す。文書デコーダ50は、個々の状態エントリー720の状態が変化するに従って、GUI900に表示された状態インジケータを更新または置き換える。
さらにまた、文書デコーダ50は、状態インジケータ740を用いて、適当な方法で、関連づけられた状態エントリー720の受付状態を示す。例えば、一部の実施形態において、文書デコーダ50は、その状態エントリーの色の状態インジケータ740を生成することにより、状態エントリーの受付状態を示す。文書デコーダ50は、関連づけられた状態インジケータ740の色を変化させることにより、または、異なる色の新しい状態インジケータ740を生成することにより、その状態エントリーの受付状態の変化を示してもよい。図8Bは、データ処理システム10の一実施形態を示し、文書デコーダ50は、「IS_NOT_DONE」の受付状態を赤い状態インジケータ740で示し(図8Bにおいて、状態エントリー720eと関連づけられた影付けされた状態インジケータ740eにより示す)、「ACCEPTED」の受付状態を黄色の状態インジケータ740で示し(図8Bにおいて、状態エントリー720bと関連づけられたクロスハッチされた状態インジケータ740bにより示す)、「IS_DONE」の受付状態を緑色の状態インジケータ740で示す(図8Bにおいて、状態エントリー720a、720c、720dと関連づけられた影付けされていない状態インジケータ740a、740c、740dにより示す)。
また、一部の実施形態において、文書デコーダ50は、1つ以上の未結合ノード702の受付状態を使用して、それらの未結合ノード70の親ノードの「有効受付」を判断する。有効受付は、文書デコーダ50が1つの未結合ノード702の受け付けられた子ノードの適当な組み合わせを分析したかどうかを示し、文書デコーダ50は、その子ノードの受付状態に基づき、1つの未結合ノード702の有効受付を判断する。結果として、文書デコーダ50は、未結合ノードの有効受付を用いて、ノードとその全ての子の完全性を示す。一方、一実施形態において、1つのノードの受付状態は、文書デコーダ50がそのノードの子のインスタンスの始めを検知した結果として変化するが、有効受付は、文書デコーダ50がそのノードの子を完全に検知した結果として変化する。このように、1つのノードの有効受付は、そのノードの下の階層レベルの完全性を反映し、有効受付は、すべてのノードの受付状態より正確なインジケータとなる。
例えば、図8Aの未結合文書700xを参照して、文書デコーダ50は、未結合ノード702aの必要な子ノードの完全性に基づき、未結合ノード702aであるエレメントBのインスタンスの有効受付を判断する。例えば、図8Aに示したように、未コンパイルスキーマ80xは、エレメントBのインスタンスは、エレメントCの最低2つのインスタンスとエレメントCの最大3つのインスタンスを有し、文書デコーダ50は子の受付状態に基づいてエレメントBのインスタンスの有効受付を決定する。一部の実施形態において、文書デコーダ50は、有効受付、または有効受付を記述する情報を関連する状態エントリー720の有効受付フィールド(図示せず)に格納する。文書デコーダ50は、文書状態スタック710から状態エントリー720を削除する際、有効受付フィールドを更新する。また、文書デコーダ50は、未結合文書700の復号の際、適当な方法で有効受付を使用する。一例として、文書デコーダ50は、受付状態に関して上で説明したように、各未結合ノード702の有効受付をユーザにGUI900上で表示してもよい。
さらにまた、この説明では、未結合文書700の復号における受付状態の使用に焦点を絞ったが、文書デコーダ50、またはデータ処理システム10のその他のアプリケーションやコンポーネントは上述の方法を使用して、他のタイプの文書を復号する際にその完全性を判断することもできる。さらにまた、データ処理システム10の他のアプリケーションやコンポーネントが処理しているノードを受付状態とするために、データ文書70の処理の際に上記の方法を使用してもよい。例えば、データ処理システム10の一実施形態において、生成アプリケーション20は、データ文書70を検証中にこれらの方法を用い、GUI900に、これらのノード702の受付状態を判断するために上述の方法に基づいてこれらのデータ文書70のノードが適格であるかどうか反映してもよい。
上述の説明は、例示を目的として、文書デコーダ50が受付状態または有効受付を決定する上述の方法を使用する実施形態に焦点を絞ったが、別の実施形態において、データ処理システム10のいかなるエレメントがこれらの方法を使用してもよい。さらにまた、いかなるエレメントがGUI900とインターラクトして、GUI900に受付状態と有効受付に関する情報を提供してもよい。データ処理システム10の一部の実施形態において、結合モジュール390として機能する仮想マシンは、上記の方法をサポートし、図4Bを参照して説明した結合機能を提供するのに加えて、GUI900に受付状態と有効受付情報を提供してもよい。
結果として、受付状態と有効受付の両方を用いて、データ処理システム10のエレメントに有用な情報を提供でき、及び/または復号または動作のその他の段階で使用することができる。また、一部の実施形態において、受付状態と有効受付は、非標準XML区切りを用いる文書の処理を容易にする。結果として、上述の方法は、動作上のメリットを提供する。
本発明をいくつかの実施形態を使って説明したが、当業者には無数の変更、変形、変換、修正等が可能であり、本発明は、添付した請求項の範囲に入るこれらの変更、変形、変換、修正等も含むものである。
なお、本開示に当たり、以下の付記を記す。
(付記1)
マークアップ言語文書を分析する方法であって、
マークアップ言語文書において、第1のノードタイプの第1のデータノードの始まりを検知するステップと、
前記第1のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指示する第1のデータ定義を特定するステップと、
前記第1のデータノードと関連づけられた第1のエントリーをデータ構造に加えるステップと、
前記マークアップ言語文書から前記第1のデータノードの内容を読み出すステップと、
前記第1のデータ定義と、前記第1のデータノードから読み出した前記内容とに基づき、前記第1のデータノードの状態を決定するステップと、
グラフィカルユーザインターフェイス(GUI)上に前記第1のデータノードの前記状態を表示するステップと、
を有することを特徴とする方法。
(付記2)
付記1に記載の方法であって、
前記第1のデータノードの前記状態を決定するステップは、前記第1のデータノードの受付状態を決定するステップを有し、
前記受付状態は、前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示し、
前記状態を表示するステップは、前記第1のデータノードの受付状態をGUIに表示するステップを有することを特徴とする方法。
(付記3)
付記1に記載の方法であって、さらに、
前記第1のデータノードの追加的内容を前記マークアップ言語文書を読み出すステップと、
前記第1のデータ定義と前記追加的内容とに基づいて前記第1のデータノードの更新後の状態を決定するステップと、
前記第1のデータノードの前記更新後の状態を前記GUIに表示するステップと、
を有することを特徴とする方法。
(付記4)
付記3に記載の方法であって、
前記更新後の状態を表示するステップは、前記第1のデータノードの前記状態を示すテキストと関連づけられた色を前記GUI上で変化させるステップを有することを特徴とする方法。
(付記5)
付記1に記載の方法であって、前記第1のデータノードの内容を読み出すステップは、
前記第1のデータノード内の、前記第1のデータノードの子ノードである第2のデータノードの始めを特定するステップと、
前記第1のデータノードの子ノードと関連づけられた発生回数カウントをインクリメントするステップと、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出すステップと、を有し、
前記第1のデータノードの前記状態を決定するステップは、前記発生回数カウントに基づき前記第1のデータノードの前記状態を決定するステップを有することを特徴とする方法。
(付記6)
付記5に記載の方法であって、前記第2のデータノードは第2のノードタイプを有し、
前記方法は、さらに、
前記第2のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指定する第2のデータ定義を特定するステップと、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出すステップと、
前記第2のデータ定義に基づき前記第2のデータノードの受付状態であって、前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示す前記受付状態を決定するステップと、
を有し、
前記第1のデータノードの前記状態を決定するステップは、前記第1のデータノードの1つ以上の子ノードの前記受付状態に基づき前記第1のデータノードの効果的受付を決定するステップを有することを特徴とする方法。
(付記7)
付記6に記載の方法であって、さらに、
前記第1のデータノードと前記第2のデータノードの一方の追加的内容を前記マークアップ言語文書から読み出すステップと、
前記第1のデータ定義と前記追加的内容に基づき前記第1のデータノードの更新後の効果的受付を決定するステップと、
前記第1のデータノードの前記更新後の効果的受付を前記GUI上に表示するステップと、
を有することを特徴とする方法。
(付記8)
付記7に記載の方法であって、
前記更新後の効果的受付を表示するステップは、前記効果的受付を示すテキストと関連づけられた色を前記GUI上で変化させるステップを有することを特徴とする方法。
(付記9)
媒体中に符号化された、マークアップ言語文書を分析するロジックであって、実行された時、
マークアップ言語文書において、第1のノードタイプの第1のデータノードの始まりを検知し、
前記第1のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指示する第1のデータ定義を特定し、
前記第1のデータノードと関連づけられた第1のエントリーをデータ構造に加え、
前記マークアップ言語文書から前記第1のデータノードの内容を読み出し、
前記第1のデータ定義と、前記第1のデータノードから読み出した前記内容とに基づき、前記第1のデータノードの状態を決定し、
グラフィカルユーザインターフェイス(GUI)上に前記第1のデータノードの前記状態を表示することを特徴とするロジック。
(付記10)
付記9に記載のロジックであって、
前記ロジックは、前記第1のデータノードの受付状態を決定することにより、前記第1のデータノードの前記状態を決定するように動作可能であり、
前記受付状態は、前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示し、
前記ロジックは前記第1のデータノードの受付状態をGUIに表示することにより、前記第1のデータノードの前記受付状態を表示することを特徴とするロジック。
(付記11)
付記9に記載のロジックであって、前記ロジックは、さらに
前記第1のデータノードの追加的内容を前記マークアップ言語文書を読み出し、
前記第1のデータ定義と前記追加的内容とに基づいて前記第1のデータノードの更新後の状態を決定し、
前記第1のデータノードの前記更新後の状態を前記GUIに表示することを特徴とするロジック。
(付記12)
付記11に記載のロジックであって、前記ロジックは、前記第1のデータノードの前記状態を示すテキストと関連づけられた色を前記GUI上で変化させることにより、前記更新後の状態を表示するように動作可能であることを特徴とするロジック。
(付記13)
付記9に記載のロジックであって、前記ロジックは、
前記第1のデータノード内の第2のデータノードの始めを特定し、前記第2のデータノードは前記第1のデータノードの子ノードであり、
前記第1のデータノードの子ノードと関連づけられた発生回数カウントをインクリメントし、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出すことにより、前記第1のデータノードの内容を読み出し、
前記第1のデータノードの前記状態の決定は、前記発生回数カウントに基づき前記第1のデータノードの前記状態の決定を含む、
ことを特徴とするロジック。
(付記14)
付記13に記載のロジックであって、前記第2のデータノードは第2のノードタイプを有し、
前記ロジックは、さらに、
前記第2のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指定する第2のデータ定義を特定し、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出し、
前記第2のデータ定義に基づき前記第2のデータノードの受付状態であって、
前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示す前記受付状態を決定し、
前記第1のデータノードの前記状態の決定、前記第1のデータノードの1つ以上の子ノードの前記受付状態に基づき前記第1のデータノードの効果的受付の決定を含むことを特徴とするロジック。
(付記15)
付記14に記載のロジックであって、前記ロジックは、さらに、
前記第1のデータノードと前記第2のデータノードの一方の追加的内容を前記マークアップ言語文書から読み出し、
前記第1のデータ定義と前記追加的内容に基づき前記第1のデータノードの更新後の効果的受付を決定し、
前記第1のデータノードの前記更新後の効果的受付を前記GUI上に表示することを特徴とするロジック。
(付記16)
付記15に記載のロジックであって、前記ロジックは、
前記効果的受付を示すテキストと関連づけられた色を前記GUI上で変化させることにより前記更新後の効果的受付を表示するように動作することを特徴とするロジック。
(付記17)
マークアップ言語文書を分析するシステムであって、
マークアップ言語文書を格納するメモリと、
プロセッサから受け取った情報に基づいて1つ以上のデータノードの状態を表示するグラフィカルユーザインターフェイス(GUI)と、
プロセッサであって、
マークアップ言語文書において、第1のノードタイプの第1のデータノードの始まりを検知し、
前記第1のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指示する第1のデータ定義を特定し、
前記第1のデータノードと関連づけられた第1のエントリーをデータ構造に加え、
前記マークアップ言語文書から前記第1のデータノードの内容を読み出し、
前記第1のデータ定義と、前記第1のデータノードから読み出した前記内容とに基づき、前記第1のデータノードの状態を決定し、
前記GUI上に前記第1のデータノードの前記状態を表示するプロセッサと、
を有することを特徴とするシステム。
(付記18)
付記17に記載のシステムであって、
前記プロセッサは、前記第1のデータノードの受付状態を決定することにより、前記第1のデータノードの前記状態を決定し、
前記受付状態は、前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示し、
前記プロセッサは、前記第1のデータノードの受付状態を前記GUIに表示することにより、前記状態を表示することを特徴とするシステム。
(付記19)
付記17に記載の方法であって、前記プロセッサは、さらに
前記第1のデータノードの追加的内容を前記マークアップ言語文書を読み出し、
前記第1のデータ定義と前記追加的内容とに基づいて前記第1のデータノードの更新後の状態を決定し、
前記第1のデータノードの前記更新後の状態を前記GUIに表示することを特徴とするシステム。
(付記20)
付記19に記載のシステムであって、前記プロセッサは、前記第1のデータノードの前記状態を示すテキストと関連づけられた色を前記GUI上で変化させることにより、前記更新後の状態を表示することを特徴とするシステム。
(付記21)
付記17に記載のシステムであって、前記プロセッサは、
前記第1のデータノード内の、前記第1のデータノードの子ノードである第2のデータノードの始めを特定し、
前記第1のデータノードの子ノードと関連づけられた発生回数カウントをインクリメントし、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出すことにより前記第1のデータノードの内容を読み出し、
前記第1のデータノードの前記状態の決定は、前記発生回数カウントに基づき前記第1のデータノードの前記状態の決定を含む、ことを特徴とするシステム。
(付記22)
付記21に記載のシステムであって、
前記第2のデータノードは第2のノードタイプを有し、
前記プロセッサは、
前記第2のノードタイプと関連づけられた、前記第1のノードタイプの定義された内容を指定する第2のデータ定義を特定し、
前記第2のデータノードの内容を前記マークアップ言語文書から読み出し、
前記第2のデータ定義に基づき前記第2のデータノードの受付状態であって、前記第1のデータ定義の前記定義された内容の1つ以上が前記第1のデータノードから読み出されたかどうかを示す受付状態を決定し、
前記第1のデータノードの前記状態の決定は、前記第1のデータノードの1つ以上の子ノードの前記受付状態に基づき前記第1のデータノードの効果的受付の決定を含むことを特徴とするシステム。
(付記23)
付記22に記載のシステムであって、前記プロセッサは、さらに
前記第1のデータノードと前記第2のデータノードの一方の追加的内容を前記マークアップ言語文書から読み出し、
前記第1のデータ定義と前記追加的内容に基づき前記第1のデータノードの更新後の効果的受付を決定し、
前記第1のデータノードの前記更新後の効果的受付を前記GUI上に表示することを特徴とするシステム。
(付記24)
付記23に記載のシステムであって、
前記プロセッサは、前記効果的受付を示すテキストと関連づけられた色を前記GUI上で変化させることにより、前記更新後の効果的受付を表示することを特徴とするシステム。