(57)【特許請求の範囲】
【請求項１】
格納対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、格納対象となる前記XMLデータからタグの値を読み込んで該タグのXPathを含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したタグの値を、該タグのXPathを含む前記組み合わせ中の前記RDBのテーブル名及びカラム名で特定される前記RDBのテーブルのカラムに対して書き込むことにより、前記XMLデータを前記RDBへ格納する格納手段とを備え、
前記格納手段は、前記XMLデータの繰り返し部分については、１つの繰り返し部分毎に、タグの値をバッファに蓄積した時点で前記RDBの当該繰り返し部分のタグの値を格納するテーブルに対して、レコード中の値が未だ定まっていないカラムにはダミーの値を使用したINSERT文を発行してレコードを挿入する手段と、前記ダミーの値を書き出したカラムの値に対応するタグの値を前記XMLデータから読み出したときにUPDATE文を発行して前記レコードを更新する手段とを含むことを特徴とするXMLデータのRDBへの格納装置。
【請求項２】
取得対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、前記RDBのテーブルのカラムの値を読み出して該テーブル名及びカラム名を含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したカラムの値を、該テーブル名及びカラム名を含む前記組み合わせ中の前記XPathで特定される前記タグの値として前記XMLデータに書き出すことにより、前記RDBから前記XMLデータを取得する取得手段とを備え、
前記取得手段は、前記XMLデータの繰り返し部分については、当該繰り返し部分のタグの値を格納するテーブルに対してSELECT文を発行し、１レコード毎に、当該レコード中のカラムの値を該当するバッファに蓄積した後、当該繰り返し部分のタグに対応する値を前記バッファから読み出して前記XMLデータのストリームに書き出す処理を繰り返す手段を含むことを特徴とするRDBからのXMLデータの取得装置。
【請求項３】
格納対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、格納手段とを備えたコンピュータにおけるXMLデータのRDBへの格納方法であって、
前記格納手段が、格納対象となる前記XMLデータからタグの値を読み込んで該タグのXPathを含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したタグの値を、該タグのXPathを含む前記組み合わせ中の前記RDBのテーブル名及びカラム名で特定される前記RDBのテーブルのカラムに対して書き込むことにより、前記XMLデータを前記RDBへ格納する格納ステップを有し、且つ、
前記格納ステップは、前記XMLデータの繰り返し部分については、１つの繰り返し部分毎に、タグの値をバッファに蓄積した時点で前記RDBの当該繰り返し部分のタグの値を格納するテーブルに対して、レコード中の値が未だ定まっていないカラムにはダミーの値を使用したINSERT文を発行してレコードを挿入するステップと、前記ダミーの値を書き出したカラムの値に対応するタグの値を前記XMLデータから読み出したときにUPDATE文を発行して前記レコードを更新するステップとを含むことを特徴とするXMLデータのRDBへの格納方法。
【請求項４】
取得対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、取得手段とを備えたコンピュータにおけるRDBからのXMLデータの取得方法であって、
前記取得手段が、前記RDBのテーブルのカラムの値を読み出して該テーブル名及びカラム名を含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したカラムの値を、該テーブル名及びカラム名を含む前記組み合わせ中の前記XPathで特定される前記タグの値として前記XMLデータに書き出すことにより、前記RDBから前記XMLデータを取得する取得ステップを有し、且つ、
前記取得ステップは、前記XMLデータの繰り返し部分については、当該繰り返し部分のタグの値を格納するテーブルに対してSELECT文を発行し、１レコード毎に、当該レコード中のカラムの値を該当するバッファに蓄積した後、当該繰り返し部分のタグに対応する値を前記バッファから読み出して前記XMLデータのストリームに書き出す処理を繰り返すステップを含むことを特徴とするRDBからのXMLデータの取得方法。
【請求項５】
格納対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリを備えたコンピュータを、
格納対象となる前記XMLデータからタグの値を読み込んで該タグのXPathを含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したタグの値を、該タグのXPathを含む前記組み合わせ中の前記RDBのテーブル名及びカラム名で特定される前記RDBのテーブルのカラムに対して書き込むことにより、前記XMLデータを前記RDBへ格納する格納手段であって、前記XMLデータの繰り返し部分については、１つの繰り返し部分毎に、タグの値をバッファに蓄積した時点で前記RDBの当該繰り返し部分のタグの値を格納するテーブルに対して、レコード中の値が未だ定まっていないカラムにはダミーの値を使用したINSERT文を発行してレコードを挿入する手段と、前記ダミーの値を書き出したカラムの値に対応するタグの値を前記XMLデータから読み出したときにUPDATE文を発行して前記レコードを更新する手段とを含む格納手段として機能させるプログラム。
【請求項６】
取得対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリを備えたコンピュータを、
前記RDBのテーブルのカラムの値を読み出して該テーブル名及びカラム名を含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したカラムの値を、該テーブル名及びカラム名を含む前記組み合わせ中の前記XPathで特定される前記タグの値として前記XMLデータに書き出すことにより、前記RDBから前記XMLデータを取得する取得手段であって、前記XMLデータの繰り返し部分については、当該繰り返し部分のタグの値を格納するテーブルに対してSELECT文を発行し、１レコード毎に、当該レコード中のカラムの値を該当するバッファに蓄積した後、当該繰り返し部分のタグに対応する値を前記バッファから読み出して前記XMLデータのストリームに書き出す処理を繰り返す手段を含む取得手段として機能させるプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はXMLデータをRDBに格納する装置およびXMLデータをRDBから取得する装置に関する。
【０００２】
【従来の技術】
XML（eXtensible Markup Language）で記述されたデータをRDB（Relational Data Base）に格納する際、XMLデータをそのまま全部ストリーム（Stream）で格納するのではなく、検索などが有効に行えるように、RDBの各カラムとXMLの各タグの値とを対応付けて幾つかのテーブルに格納する。このため、従来のこの種の格納装置は、RDBに格納しやすい他の形式のXMLデータにXMLデータを一括して変換してバッファに蓄積してからRDBに格納している。また、こうして格納されたXMLデータをRDBから取得する際には、XMLデータを一括して取り出してバッファに蓄積し、格納しやすい形式から目的のXMLデータの形式に変換している。RDBに格納しやすい形式のXMLデータは、通常XMLデータのタグがRDBのカラム名、タグの値がRDBのカラムの内容となる以下のような形式のXMLデータである。
【０００３】
0004165086.tif 000002
【０００４】
【発明が解決しようとする課題】
このような構成を有する従来の装置では、通常XSLT（eXtensible Style Language Transformation）プロセッサやパーズツリーであるDOM（Document Object Model）オブジェクトを使用するが、一般的にXSLTプロセッサまたはDOMオブジェクトがバッファとして使用するメモリ容量は、扱うXMLデータが大きくなればそれにつれて大きくなり、装置全体が使用するメモリ量をXMLデータのサイズによらずXMLの構造を表すデータ（DTD(Document Type Definition)またはXMLShema)の大きさと同じオーダーの一定値に保つことができない。
【０００５】
その理由は、XMLデータを他形式のXMLデータに一括して変換してバッファに蓄積した後にDBに格納するため、繰り返し項目が多数あるサイズの大きいXMLデータについてこれを行う場合、使用メモリ量がXMLデータのサイズにほとんどの場合比例するからである。
【０００６】
【発明の目的】
本発明の目的は、繰り返し項目が多いXMLデータをRDBに格納する場合に、XMLデータに繰り返し項目が多数あっても使用メモリ量をXMLデータのサイズによらず、XMLの構造を表すデータDTD等の大きさと同じオーダーの一定値に保つことができるようにすることにある。
【０００７】
本発明の別の目的は、繰り返し項目が多いXMLデータをRDBから取得する場合に、XMLデータに繰り返し項目が多数あっても使用メモリ量をXMLデータのサイズによらず、XMLの構造を表すデータDTD等の大きさと同じオーダーの一定値に保つことができるようにすることにある。
【０００８】
【課題を解決するための手段】
本発明のXMLデータのRDBへの格納装置は、格納対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、格納対象となる前記XMLデータからタグの値を読み込んで該タグのXPathを含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したタグの値を、該タグのXPathを含む前記組み合わせ中の前記RDBのテーブル名及びカラム名で特定される前記RDBのテーブルのカラムに対して書き込むことにより、前記XMLデータを前記RDBへ格納する格納手段とを備え、前記格納手段は、前記XMLデータの繰り返し部分については、１つの繰り返し部分毎に、タグの値をバッファに蓄積した時点で前記RDBの当該繰り返し部分のタグの値を格納するテーブルに対して、レコード中の値が未だ定まっていないカラムにはダミーの値を使用したINSERT文を発行してレコードを挿入する手段と、前記ダミーの値を書き出したカラムの値に対応するタグの値を前記XMLデータから読み出したときにUPDATE文を発行して前記レコードを更新する手段とを含んでいる。
【０００９】
また本発明のRDBからのXMLデータの取得装置は、取得対象となるXMLデータの構造を表すデータで定義された、値が入りうるXMLのタグ毎に、該タグのXPathと、該タグと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとの組み合わせを有し、１回以上の繰り返し指定のあるタグについてはその実際の繰り返し数に関わらず一組分だけの前記組み合わせを有する内部データを記憶するメモリと、前記RDBのテーブルのカラムの値を読み出して該テーブル名及びカラム名を含む前記組み合わせ中の前記バッファに記憶し、該バッファに記憶したカラムの値を、該テーブル名及びカラム名を含む前記組み合わせ中の前記XPathで特定される前記タグの値として前記XMLデータに書き出すことにより、前記RDBから前記XMLデータを取得する取得手段とを備え、前記取得手段は、前記XMLデータの繰り返し部分については、当該繰り返し部分のタグの値を格納するテーブルに対してSELECT文を発行し、１レコード毎に、当該レコード中のカラムの値を該当するバッファに蓄積した後、当該繰り返し部分のタグに対応する値を前記バッファから読み出して前記XMLデータのストリームに書き出す処理を繰り返す手段を含んでいる。
【００１０】
【作用】
本発明のXMLデータのRDBからの取得装置にあっては、XMLデータの繰り返し部分については、１つの繰り返し部分毎に、タグの値をバッファに蓄積した時点でRDBの当該繰り返し部分のタグの値を格納するテーブルに対して、レコード中の値が未だ定まっていないカラムにはダミーの値を使用したINSERT文を発行してレコードを挿入する。そして、ダミーの値を書き出したカラムの値に対応するタグの値をXMLデータから読み出したときにUPDATE文を発行して更新する。これにより、XMLデータの繰り返し部分のタグの値を格納するRDBのテーブルが、その繰り返し部分に含まれない外のタグの値をも格納する場合、当該テーブルに対するデータの書き出しがINSERT文、UPDATE文による複数回に別れるものの、XMLデータの繰り返し部分の数に関わらず一組分だけのバッファだけで足り、XMLデータのサイズがいくら大きくなっても内部データのサイズはDTDの大きさを超えることがない。
【００１１】
また本発明のRDBからのXMLデータの取得装置にあっては、XMLデータの繰り返し部分については、当該繰り返し部分のタグの値を格納するテーブルに対してSELECT文を発行し、１レコード毎に、当該レコード中のカラムの値を該当するバッファに蓄積した後、当該繰り返し部分のタグに対応する値を前記バッファから読み出して前記XMLデータのストリームに書き出す処理を繰り返すため、XMLデータの繰り返し部分の数に関わらず一組分だけのバッファだけで足り、XMLデータのサイズがいくら大きくなっても内部データのサイズはDTDの大きさを超えることがない。
【００１２】
【発明の実施の形態】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
【００１３】
図１を参照すると、本発明の実施の形態におけるXMLデータのRDBへの格納装置１００は、XMLデータのRDBへの格納手段１０１と、内部データDA１０１を記憶するメモリ１０２とを備え、格納対象となるXMLデータ１０３を記憶する入力装置１０４とXMLデータを格納するRDB１０５とに接続されている。入力装置１０４は例えば磁気ディスク、通信バッファ等である。なお、１１０は磁気ディスク、半導体メモリ等のコンピュータ可読記録媒体であり、格納用プログラムが記録されている。ここに記録された格納用プログラムは、格納装置１００を構成するコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にモジュールとしての格納手段１０１を実現する。
【００１４】
内部データDA１０１は、入力対象となるXMLデータ１０３毎に事前に用意されており、XMLデータ１０３の構造を表し、RDB１０５との対応関係を持ち、XMLデータ１０３の中の繰り返しの数に関わらず一組分だけのバッファを持っている。より具体的には、内部データDA１０１は、XMLデータ１０３の構造を表すデータ（DTDまたはXMLShema）について、XMLデータ１０３の繰り返し部分を子セグメントにした木構造の構造になっており、値が入りうるXMLのタグについて、そのXPathと、それと対応付けられているRDB１０５のテーブル名及びカラム名と、値を保持するバッファとを持っている。親セグメントと子セグメントとはポインタで連結される。
【００１５】
格納手段１０１は、内部データDA１０１を順番にたどると同時に入力のXMLデータ１０３を読みながらRDB１０５に対してデータ追加操作を行うSQL文を発行するように動作する。このときにXMLデータ１０３のサイズがいくら大きくなっても内部データDA１０１のサイズは、DTDの大きさを超えることがない。
【００１６】
また、本発明の実施の形態におけるRDBからのXMLデータの取得装置２００は、RDBからのXMLデータの取得手段２０１と、内部データDA２０１を記憶するメモリ２０２とを備え、XMLデータを格納するRDB２０５と取得したXMLデータ２０３を記憶する出力装置２０４とに接続されている。出力装置２０４は例えば磁気ディスク、通信バッファ等である。なお、２１０は磁気ディスク、半導体メモリ等のコンピュータ可読記録媒体であり、取得用プログラムが記録されている。ここに記録された取得用プログラムは、取得装置２００を構成するコンピュータに読み取られ、そのコンピュータの動作を制御することにより、そのコンピュータ上にモジュールとしての取得手段２０１を実現する。
【００１７】
内部データDA２０１は、取得対象となるXMLデータ２０３毎に事前に用意されており、XMLデータ２０３の構造を表し、RDB２０５との対応関係を持ち、XMLデータ２０３の中の繰り返しの数に関わらず一組分だけのバッファを持っている。より具体的には、内部データDA２０１は、XMLデータ２０３の構造を表すデータ（DTDまたはXMLShema）について、XMLデータ２０３の繰り返し部分を子セグメントにした木構造の構造になっており、値が入りうるXMLのタグについて、そのXPathと、それと対応付けられているRDB２０５のテーブル名及びカラム名と、値を保持するバッファとを持っている。親セグメントと子セグメントとはポインタで連結される。
【００１８】
取得手段２０１は、内部データDA２０１を順番にたどると同時にXMLデータ２０３を書き出しながらRDB２０５に対してデータ取得操作を行うSQL文を発行するよう動作する。このときにXMLデータ２０３のサイズがいくら大きくなっても内部データDA２０１のサイズは、DTDの大きさを超えることがない。
【００１９】
次に、図２のフローチャートを参照して本実施の形態の格納装置１００の全体の動作について詳細に説明する。
【００２０】
まず、内部データDA１０１の着目する場所を先頭にする（図２のステップS１０１）。内部データDA１０１はセグメントの木構造になっているため、最初はルートのセグメントの先頭を着目する場所に定める。次に、XMLデータ１０３を内部データDA１０１の着目中のXPathに合致するところまで読む（ステップS１０２）。ここでXPathに合致するところがXMLデータ１０３になかったら（ステップS１１１でＮＯ）、エラーにする。さらに、そのXPathに対応するタグが繰り返しの始まりかチェックし（ステップS１１２）、繰り返しの始まりの場合はステップS１０３に進み、繰り返しの始まりでない場合はステップS１０５に進む。繰り返しの始まりの箇所には子セグメントへのポインタが入っているので、ポインタの有無により繰り返しの始まりか否かが判明する。
【００２１】
ステップS１０３では、親セグメントについてバッファに入っている値を元に、RDB１０５の該当するテーブルに対してINSERT文またはUPDATE文を発行する。INSERT文は当該親セグメントにおける初めての子セグメントの開始時（繰り返しの始まり）に使用され、UPDATE文は当該親セグメントにおける２番目以降の子セグメントの開始時（繰り返しの始まり）に使用される。INSERT文では、テーブルに１行が挿入されるが、その行の全てのカラムの値がバッファに入っていなければ、値が入っていないところはNULLなどのダミーのデータを入れる。次に、内部データDA１０１のそれに対応する子セグメントについて、「子セグメントについて開始」から始まる部分を再帰的に実行する（ステップS１０４）。そして、ステップS１１３に進む。
【００２２】
他方、ステップS１０５では、XMLデータ１０３からXPathに対応する値を読んで内部データDA１０１のバッファに格納し、XMLデータ１０３のXPathに対応するXMLの終了タグを読み飛ばし、内部データDA１０１の着目する場所を次に進める。次に、もしも着目していたXPathが、RDB１０５のテーブルのカラムが子孫のセグメントからINSERT文を発行したDBレコードに対応付けられていた場合は、それらのDBレコードに対してUPDATE文を発行する（ステップS１０６）。そして、ステップS１１３に進む。
【００２３】
ステップS１１３では、内部データの着目場所が着目中のセグメントの終わりかどうかチェックし、終わりでない場合はステップS１０２からの処理を繰り返し実行する。終わりの場合には、当該セグメントのバッファに追加された値がある場合は、バッファに入っている値を元にRDB１０５に対して、初めての書き出しの際にはINSERT文を発行し、２度目以降の同じレコードに対する書き出しの際にはUPDATE文を発行する（ステップS１０７）。そして、XMLデータ１０３の次の部分がそのセグメントを繰り返すタグになっているかチェックし、繰り返しになっている場合は、そのセグメントのバッファを再利用するためにステップS１０９でコピーしたバッファ以外のバッファを空にし（ステップS１０８）、ステップS１０２からの処理を繰り返し実行する。繰り返しでない場合はリターンする。なお、ステップS１０８でそのセグメントのバッファを全て空にするようにしても良いが、その場合にはステップS１０９からの処理を繰り返す。
【００２４】
このように本実施の形態の格納装置１００では、XMLデータ１０３をRDB１０５に格納する場合に、中間的にメモリ１０２上に持つ値はXMLデータ１０３の構造（DTD）の大きさとなるように構成されているため、たとえ繰り返し項目が多数あってXMLデータ１０３のサイズがいくら大きくなっても、中間的にメモリ１０２上に持つデータのサイズを入力XMLデータ１０３のサイズによらずDTDの大きさと同じオーダーの一定値にできる。
【００２５】
次に、図３のフローチャートを参照して本実施の形態の取得装置２００の全体の動作について詳細に説明する。
【００２６】
まず、内部データDA２０１の着目する場所を先頭にする（図３のステップS２０１）。内部データDA２０１はセグメントの木構造になっているため、最初はルートのセグメントの先頭を着目する場所に定める。次に、そのセグメントの着目中のXPathに対応付けられているRDB２０５のテーブルに対しSELECT文を発行する（ステップS２０２）。次に、ステップS２０２で発行したSQL文の実行結果の次のレコードがあるかチェックする（ステップS２０３）。次のレコードがない場合（ステップS２１１でＮＯ）、リターンする。次のレコードがある場合は、ステップS２０２で発行したSQL文の実行結果の次のレコードをフェッチし、得られた値を内部データDA２０１のそのセグメントのバッファに入れる（ステップS２０４）。
【００２７】
次に、内部データDA２０１の着目場所のXPathがXMLデータ２０３の繰り返しに対応するタグかどうかチェックし（ステップS２１２）、繰り返しの始まりの場合はステップS２０５へ進み、繰り返しの始まりでない場合はステップS２０６に進む。繰り返しの始まりの箇所には子セグメントへのポインタが入っているので、ポインタの有無により繰り返しの始まりか否かが判明する。
【００２８】
ステップS２０５では、そのXPathに対応する内部データDA２０１の子セグメントについて、「子セグメントについて開始」からの処理を再帰的に実行する。そして、ステップS２１３に進む。
【００２９】
ステップS２０６では、内部データDA２０１の着目中のXPathに対応するバッファの値が空の場合にはRDB２０５に対してSELECT文を発行してバッファの値を埋める。そして、XPathに対応するタグとバッファの値をXMLデータ２０３に書き出し、内部データDA２０１の着目中の場所を次へ進める（ステップS２０７）。そして、ステップS２１３に進む。
【００３０】
ステップS２１３では、内部データDA２０１の着目中の場所がそのセグメントの終わりかどうかチェックする。セグメントの終わりでない場合はステップS２１２からの処理を繰り返し実行する。セグメントの終わりの場合は、ステップS２０３からの処理を繰り返し実行する。
【００３１】
本実施の形態の取得装置２００では、XMLデータ２０３をRDB２０５から取得する場合、XMLデータ２０３はストリームとして書き出してしまい、中間的にメモリ２０２上に持つ値はXMLデータ２０３の構造（DTD）の大きさとなるように構成されているため、たとえ繰り返し項目が多数あってXMLデータ２０３のサイズがいくら大きくなっても、中間的にメモリ２０２上に持つデータのサイズをXMLデータ２０３のサイズによらずDTDの大きさと同じオーダーの一定値にできる。
【００３２】
次に、具体的な実施例を用いて本実施の形態の動作を説明する。
【００３３】
図４はXMLデータのDTDと、RDBのDBスキーマの具体例を示す。DTDでは要素型宣言部分のみを示してあり、要素Itemが繰り返される構造となっている。また、RDBは、PORequestテーブルとPOItemテーブルとの２つのテーブルを持つ。
【００３４】
図５はXML中のタグとDBテーブルのカラムとの対応関係の具体例を示す。この例では、値が入りうるXMLのタグのうち、Xpathが“/POReq/PONumber”，“/POReq/PODate”, “/POReq/fromRole/BusinessId”, “/POReq/toRole/BusinessId”であるタグの値が、PORequestテーブルのカラムPOId,Date,From,Toの値に対応する。また、XMLの繰り返し部分のタグItemに含まれる、Xpathが、“/POReq/Item/POItemNumber”,“/POReq/Item/ProductId”,“/POReq/Item/Request/Amount”,“/POReq/Item/Request/Price”であるタグの値と、当該繰り返し部分の外にある、Xpathが“/POReq/Location”であるタグの値とが、POItemテーブルのカラムPOId,ItemNumber,PId,Quantity,RequestPrice,Locationの値に対応する。なお、PORequestテーブルのカラムPOIdとPOItemテーブルのカラムPOIdとは、プライマリキーとフォーリンキーの関係にある。
【００３５】
図６は格納対象となるXMLデータの具体例を示す。この例では繰り返し項目１〜３の部分が繰り返し構造となっている。
【００３６】
図７は内部データの具体例を示す。この例の内部データは、図６のXMLデータの構造を表す図４のDTDについて、XMLデータの繰り返し部分を子セグメント（セグメント２）、それ以外を親セグメント（セグメント１）とした木構造を有し、各セグメント１、２において、図５の対応関係に従って、値が入りうるXMLのタグについて、そのXPathと、それと対応付けられているRDBのテーブル名及びカラム名と、値を保持するバッファとを設定してある。このような内部データは例えば以下のように作成される。
【００３７】
先ず、親セグメント１を生成する。次に、図５を参照すると、XMLの値が入りうる最初のXpathは“/POReq/PONumber”で、PORequestテーブルのカラムPOIdに対応するので、エントリE1を親セグメント１に生成する。同様にして、エントリE2〜E4を生成する。XMLの次のタグは繰り返しのタグItemなので、子セグメント２を生成し、親セグメント１にはタグItemのXpathと子セグメント２へのポインタを設定したエントリE5を生成する。次に、子セグメント２のエントリの生成に移るが、図５を参照すると、PORequestテーブルのカラムPOIdとPOItemテーブルのカラムPOIdとがプライマリキーとフォーリンキーの関係にあるため、プライマリキーに対応するXpathと、フォーリンキーを格納するテーブル及びカラムと、バッファとを持つエントリE50を生成した後、XMLの値が入りうる各Xpath用のエントリE51〜E54を生成する。次に、親セグメント１のエントリの生成に戻り、XMLの値が入りうる最後のXpath用のエントリE6を生成する。ここで、初期状態においては各エントリのバッファは空である。
【００３８】
以下、図４のDTDとDBスキーマで、これらの間に図５に示す対応関係があり、入力するXMLデータが図６に示すもので、図７のような内部データが用意されている場合を例にして、格納装置１００の具体的な動作を説明する。
【００３９】
XMLデータを読み始める前の内部データDA１０１の初期状態は図７に示すものとなっており、この中のセグメント１の先頭のエントリE1が着目する場所としてセットされる（ステップS１０１）。次に、この場所に対応するXPath “/POReq/PONumber” に対応するところをXMLデータから読み出す（ステップS１０２）。先頭が対応するタグとなっているのでエラーにはならず、またこのXPathはXMLデータ中の繰り返しに対応するXPathではないのでステップS１０５に進む。
【００４０】
ステップS１０５では、XMLデータの対応するタグの値 “order1” を内部データの対応するエントリE1のバッファに格納し、内部データの着目する場所を次に進める。着目中だったXPathが対応付けられているDBカラムは、子孫のセグメントでINSERT文を発行したレコードのものではないので、これに対するUPDATE文は発行されない（ステップS１０６）。次に、セグメントの終わりではないので、ステップS１０２からの処理を繰り返し実行する。XPath “/POReq/PODate”, “/POReq/fromRole/BusinessId”, “/POReq/toRole/BusinessId” について同様のこと（ステップS１０２、ステップS１０５）を繰り返した結果、内部データは図８に示すものとなる。
【００４１】
次のXPath “/POReq/Item” については、このXPathがXMLデータ中の繰り返しに対応するので、子セグメント２に基づく処理（繰り返し部分の処理）に入る前の親セグメントに対する処理として、ステップS１０３の処理を実行する。具体的には、現在の内部データのセグメント１のバッファに入っている値を元にDBのPORequestテーブルに対しINSERT文を発行する（ステップS１０３）。ここで、操作対象となるテーブルはセグメント１のバッファが空でないものに対応するテーブルだけである。このため、PORequestテーブルだけが対象となり、エントリE6のバッファが空であるPOItemテーブルに対する操作は行われない。
【００４２】
次に、このXPath “/POReq/Item”に対応する子セグメント２についてステップS１０２からの処理が再帰的に実行される（ステップS１０４）。
【００４３】
先ず、子セグメント２の最初の XPath ”/POReq/PONumber”は、”/POReq/Item”以下のパスではなく先祖セグメントのXPathに対応したものであり、DBテーブルではプライマリキーとフォーリンキーの関係にあるものとなっており（これは、子セグメント中のXpathと同じXpathが親セグメントにあるかどうかで判明する）、この場合は、バッファに親のセグメントのバッファに入っている値 “order1”をコピーし（ステップS１０９）、次のXPath “POItemNumber”に進む。すなわち、親セグメントのバッファの値が、DBテーブルの親テーブルと子テーブルを関係つけるためのプライマリキーであれば、子セグメントに子テーブルの対応するフォーリンキーの項目があるため、ここに値をコピーするわけである。
【００４４】
次に、子セグメント２におけるXPath “POItemNumber”, “ProductId”, “Request/Amout”, “Request/Price” についてステップS１０２、ステップS１０５が繰り返し実行された結果、内部データは図９に示すものとなる。
【００４５】
これでセグメント２の終わりなので、セグメントの終了時の処理を行う（ステップS１０７）。今の場合、セグメント２のバッファに入っている値を元にDBのPOItemテーブルに対してINSERT文が発行される。このとき、テーブルPOItemテーブルのカラムLocationに対応する値は、エントリE6のバッファに未だ入っていないので、このカラムについてはNULLなどのダミーのデータが使用される。
【００４６】
図６に示すXMLデータは、繰り返しのXPathの “/POReq/Item” が３つ含まれているので、同様のこと（ステップS１０２、ステップS１０５、ステップS１０７）をあと２回繰り返して、POItemテーブルに対してあと２回INSERT文が発行され、子セグメント２についての処理からセグメント１への処理へリターンする。
【００４７】
セグメント１の次のXPathは “/POReq/Location”で、これに関しステップS１０２とステップS１０５を実行した結果、内部データは図１０に示すものとなる。そして、”/POReq/Location”は、セグメント２に対応するDBのレコードのカラムに対応付けられているので、既にINSERT文が発行済みのPOItemテーブルのレコードに対して、このバッファに入っている値を元に、DBのPOItemテーブルに対してUPDATE文が発行される（ステップS１０６）。次にステップS１０７の実行に入るが、ステップS１０７は「そのセグメントのバッファで追加されたものがある場合」だけ処理を行うものであり、今の場合はバッファに新たに追加されたものがないため、何もしない。これでセグメント１の終わりで、XMLデータのRDBへの格納処理を終了する。このときにRDBに格納されているデータは図１１に示すものとなる。
【００４８】
以上の具体例では、ステップS１０３においてNULLなどのダミーのデータを入れる場面、同ステップS１０３においてUPDATE文を使用する場面、ステップS１０７においてUPDATE文を使用する場面は現れない。これらの場面は、例えば次のような具体例で現れる。
【００４９】
例えば図７のエントリE2がエントリE5とE6の間にあるような場合を考える。このような場合、親セグメント１のエントリE4までの処理を終えて、繰り返し部分の処理に入る前の親セグメント１に対するステップS１０３において、エントリE2のバッファが未だ空なので、PORequestテーブルのカラムDateにはNULLなどのダミーのデータが入れられる。また、子セグメント１の処理を終えて、エントリE2の処理に移ると、ステップS１０５でエントリE2のバッファに値が入るため、親セグメント１の処理を終える際のステップS１０７において、エントリE2のバッファに入っている値がUPDATE文を使用して、PORequestテーブルのカラムDateに書き込まれる。
【００５０】
また、ステップS１０３でUPDATE文が使用されるのは、親セグメント１に複数の繰り返し部分がある場合である。すなわち、１個目の子セグメントの処理に入る際の親セグメントに対するステップS１０３ではINSERT文が使用されるが、２個目以降の子セグメントの処理に入る際の親セグメントに対するステップS１０３の処理ではUPDATE文が使用される。
【００５１】
次に、図４のDTDとDBスキーマで、これらの間に図５に示す対応関係があり、RDBに格納されているデータが図１１に示すもので、図７のような内部データが用意されている場合を例にして、取得装置２００の具体的な動作を説明する。
【００５２】
XMLデータの書き出しを始める前の内部データDA２０１の初期状態は図７に示すものとなっており、この中のセグメント１の先頭のエントリE1が着目する場所としてセットされる（ステップS２０１）。次に、このセグメント１で対応付けられているDBカラムの値を取得するSELECT文が図１１で示される内容のDBのPORequestテーブルに対し実行される（ステップS２０２）。レコードが存在するので、ステップS２０４に進む（ステップS２０３）。SELECT文の実行結果をフェッチすることにより、セグメント１のエントリE1〜E4のバッファの値が埋まる（ステップS２０４）。この時点で内部データDA２０１は図１２に示すものとなる。
【００５３】
最初のXPath “POReq/PONumber”は繰り返しの項目ではないのでステップS２０６に進む。対応するエントリE1のバッファは空でないのでSELECT文は発行されない（ステップS２０６）。内部データDA２０１のXPath “POReq/PONumber”に対応するタグとその値がXMLデータに書き出され、次のXPathに進む（ステップS２０７）。ここで、XMLデータに書き出すときのXMLの終了タグについては、そのタグに囲まれたところが閉じられるまで書き出しが遅延される。
【００５４】
次に、XPath “/POReq/POData”, “/POReq/fromRole/BusinessId”, “/POReq/toRole/BusinessId” について同様のこと（ステップS２０７）を繰り返した結果、XMLデータの繰り返しに対応するXPath “/POReq/Item” の前までのXMLデータが書き出される。
【００５５】
次のXPath “/POReq/Item”はXMLデータ中の繰り返しに対応するので、XPath “/POReq/Item”に対応する子セグメント２について「子セグメントについて開始」からの処理が再帰的に実行される（ステップS２０５）。子セグメント２の XPath”/POReq/PONumber”は、”/POReq/Item”以下のパスではなく先祖セグメントのXPathに対応したものであり、DBテーブルではプライマリキーとフォーリンキーの関係にあるものとなっており、この場合は、エントリE50のバッファに親セグメントのエントリE1のバッファに入っている値 “order1”がコピーされ、XPath “POItemNumber”に進む（ステップS２０８）。次に、このセグメント２で対応付けられているDBカラムの値を取得するSELECT文が図１１で示される内容のDBのPOItemテーブルに対し実行される（ステップS２０２）。レコードが存在するので、ステップS２０４に進む（ステップS２０３）。SELECT文の実行結果をフェッチすることにより、セグメント２のエントリE51〜E54のバッファの値が埋まる（ステップS２０４）。
【００５６】
次に、XPath “POItemNumber”, “ProductId”, “Request/Amout”, “Request/Price” についてステップS２０７が繰り返し実行された結果、XPath “POReq/Item”に対応する繰り返し項目の１つ目がXMLデータに書き出される。これでセグメント２の終わりなのでステップS２０３からの処理を繰り返す。図１１に示すDBのPOItemテーブルは３つのレコードを含んでいるので、同様のこと（ステップS２０３、ステップS２０４、ステップS２０７）をあと２回繰り返して、残りの２つの繰り返し項目に対応する内容をXMLデータに書き出し、子セグメント２についての処理からセグメント１への処理へリターンする。
【００５７】
セグメント１の次のXPathは “/POReq/Location”で、これに対応するエントリE6のバッファが空なので、DBのPOItemテーブルにSELECT文を発行しフェッチしてバッファを埋め（ステップS２０６）、ステップS２０７を実行し対応する内容がXMLデータに書き出される。これで、XMLデータのRDBからの取得処理を終了する。この時点で内部データDA２０１は図１３に示すものとなり、書き出されたXMLデータは図６に示すものと同じものになる。
【００５８】
以上本発明の実施の形態について説明したが、本発明は以上の例に限定されずその他各種の付加変更が可能である。例えば、図１では、格納装置１０１と取得装置２０１とのそれぞれに内部データDA１０１、内部データDA２０１を設けたが、同じ構造のXMLデータについては格納装置１０１と取得装置２０１とで内部データは同じになるので、格納と取得とを同時に行わない場合には、１つの内部データを格納装置１０１と取得装置２０１とで共通に設けるようにしても良い。この場合、格納装置１０１と取得装置２０１とをあわせて、格納・取得装置として１つの装置として実現するようにしても良い。
【００５９】
【発明の効果】
以上説明したように本発明によれば、XMLデータをRDBに格納し、またRDBからXMLデータを取得する場合に、たとえXMLデータのサイズがいくら大きくなっても、使用メモリ量がDTDのサイズに比例した大きさに抑えられ、XMLデータのサイズによらずDTDの大きさと同じオーダーの一定値に抑えられる効果がある。その理由は、既存のXML処理系ではXMLデータのサイズに比例したメモリ容量を必要とするのに対し、本発明ではDTDの大きさに比例した内部データしかメモリ上に持たず、他のデータはDBへの格納ならDBに書き出してしまうし、DBからの取り出し時はXMLデータを作成するストリームに書き出してしまうためである。
【図面の簡単な説明】
【図１】本発明の実施の形態の構成を示すブロック図である。
【図２】本発明の実施の形態のXMLデータのRDBへの格納手段の動作を示す流れ図である。
【図３】本発明の実施の形態のRDBからのXMLデータの取得手段の動作を示す流れ図である。
【図４】  DTDとDBスキーマ情報の具体例を示す図である。
【図５】  XML中のタグとDBテーブルのカラムとの対応関係の具体例を示す図である。
【図６】  XMLデータの具体例を示す図である。
【図７】初期状態の内部データの具体例を示す図である。
【図８】  RDBにXMLデータを格納している最中の内部データの状態を示す図である。
【図９】  RDBにXMLデータを格納している最中の内部データの状態を示す図である。
【図１０】  RDBにXMLデータを格納している最中の内部データの状態を示す図である。
【図１１】  XMLデータを格納後のRDBの内容を示す図である。
【図１２】  XMLデータをRDBから取り出している最中の内部データの状態を示す図である。
【図１３】  XMLデータをRDBから取り出している最中の内部データの状態を示す図である。
【符号の説明】
１００  XMLデータのDBへの格納装置
１０１  XMLデータのDBへの格納手段
１０２  内部データ
１０３  入力のXMLデータ
１０４  入力装置
１０６  RDB
１１０  記録媒体
２００  DBからのXMLデータ取得装置
２０１  DBからのXMLデータ取得手段
２０２  内部データ
２０３  取得したXMLデータ
２０４  出力装置
２０５  RDB
２１０  記録媒体
【図１】
0004165086.tif 000003
【図２】
0004165086.tif 000004
【図３】
0004165086.tif 000005
【図４】
0004165086.tif 000006
【図５】
0004165086.tif 000007
【図６】
0004165086.tif 000008
【図７】
0004165086.tif 000009
【図８】
0004165086.tif 000010
【図９】
0004165086.tif 000011
【図１０】
0004165086.tif 000012
【図１１】
0004165086.tif 000013
【図１２】
0004165086.tif 000014
【図１３】
0004165086.tif 000015