(57)【特許請求の範囲】
【請求項１】
固定のXML記述を含むヘッド部と、X（Xは0以上の整数）回以上繰り返し可能であり、変数名を含むとともに前記変数名以外の記述は固定であるボディ部と、固定のXML記述を含むテイル部とを含むXML文書の構造を規定したXML(Extensible Markup Language)スキーマに基づいた、EXI（Efficient XML Interchange）エンコーダであって、
前記ボディ部の繰り返し回数に応じた個数だけ、前記変数名に対応する入力データを順次読み込む読み込み手段と、
前記ヘッド部の前記固定のXML記述に対応するEXIビット列を生成するヘッド部エンコーダと、
前記読み込み手段により入力データを読み込むごとに、前記ボディ部の変数名を前記入力データに置換したXML記述に対応するEXIビット列を生成する、ボディ部エンコーダと、
前記テイル部の前記固定のXML記述に対応するEXIビット列を生成するテイル部エンコーダと、
前記ヘッド部エンコーダにより得られたEXIビット列と、前記ボディ部エンコーダにより得られたEXIビット列と、前記テイル部エンコーダにより得られたEXIビット列を含むEXIストリームを出力する出力部と、
を備えたEXIエンコーダ。
【請求項２】
前記ボディ部エンコーダは、前記EXIビット列を、前記入力データが何回目の読み込みかに依存して生成する
ことを特徴とする請求項1に記載のEXIエンコーダ。
【請求項３】
前記テイル部エンコーダは、前記ボディ部の繰り返し回数に依存して、前記EXIビット列を生成する
ことを特徴とする請求項1または2に記載のEXIエンコーダ。
【請求項４】
固定のXML記述を含むヘッド部と、X（Xは0以上の整数）回以上繰り返し可能であり、変数名を含むとともに前記変数名以外の記述は固定であるボディ部と、固定のXML記述を含むテイル部とを含むXML文書の構造を規定したXML(Extensible Markup Language)スキーマに基づいた、EXI（Efficient XML Interchange）エンコードのためのプログラムであって、
前記ボディ部の繰り返し回数に応じた個数だけ、前記変数名に対応する入力データを順次読み込む読み込みステップと、
前記ヘッド部の前記固定のXML記述に対応するEXIビット列を生成するヘッド部エンコードステップと、
前記読み込みステップにより入力データを読み込むごとに、前記ボディ部の変数名を前記入力データに置換したXML記述に対応するEXIビット列を生成する、ボディ部エンコードステップと、
前記テイル部の前記固定のXML記述に対応するEXIビット列を生成するテイル部エンコードステップと、
前記ヘッド部エンコーダにより得られたEXIビット列と、前記ボディ部エンコーダにより得られたEXIビット列と、前記テイル部エンコーダにより得られたEXIビット列とを含むEXIストリームを出力する出力ステップと、
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、EXI（Efficient XML(Extensible Markup Language) Interchange）エンコーダおよびプログラムに関する。
【背景技術】
【０００２】
従来、ASN.1 の有限状態機械による解釈によりデコーダプログラムを生成するデコーダが知られている。
【０００３】
これと類似した方法で、EXI エンコーダを生成することが考えられる。EXIエンコーダとは、一般的に、XML文書を効率的にやりとりするため、テキストのXML文書をEXIの仕様にしたがってバイナリ化するエンコーダである。
【０００４】
そのようなEXI エンコーダの利用にあたり、エンコーダにより生成するビット列を、XML 文書の要素と正しく対応づけるには、元となるXML 文書の全ての項目についてエンコードを行う準備を事前に整えておく必要があり、コード量や、必要メモリ量などの計算資源が増加する問題がある。このようなEXIエンコーダを、資源が制約されている組み込み機器に搭載するには、不向きである。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開10-240652号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の一側面は、EXIストリームを低負荷で生成可能なEXIエンコーダおよびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一態様としてのEXIエンコーダは、固定のXML記述を含むヘッド部と、X（Xは0以上の整数）回以上繰り返し可能であり、変数名を含むとともに前記変数名以外の記述は固定であるボディ部と、固定のXML記述を含むテイル部とを含むXML文書の構造を規定したXML(Extensible Markup Language)スキーマに基づいた、EXI（Efficient XML Interchange）エンコーダであって、読み込み手段と、ヘッド部エンコーダと、ボディ部エンコーダと、テイル部エンコーダと、出力部とを備える。
【０００８】
前記読み込み手段は、前記ボディ部の繰り返し回数に応じた個数だけ、前記変数名に対応する入力データを順次読み込む。
【０００９】
前記ヘッド部エンコーダは、前記ヘッド部の前記固定のXML記述に対応するEXIビット列を生成する。
【００１０】
前記ボディ部エンコーダは、前記読み込み手段により入力データを読み込むごとに、前記ボディ部の変数名を前記入力データに置換したXML記述に対応するEXIビット列を生成する。
【００１１】
前記テイル部エンコーダは、前記テイル部の前記固定のXML記述に対応するEXIビット列を生成する。
【００１２】
前記出力部は、前記ヘッド部エンコーダにより得られたEXIビット列と、前記ボディ部エンコーダにより得られたEXIビット列と、前記テイル部エンコーダにより得られたEXIビット列を含むEXIストリームを出力する。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態に係るEXIエンコーダの構成を示す図である。
【図２】EXIストリームの構造の一例を説明するための図である。
【図３】EXIストリームの構造の他の例を説明するための図である。
【図４】BODY部に対応するEXIビット列の構成例を模式的に示す
【図５】EXIエンコーダによる処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１４】
図1は、本実施形態に係るEXIエンコーダの構成を示す。
【００１５】
このEXIエンコーダは、固定のXML記述を含むヘッド部（HEAD部）と、X（Xは0以上の整数）回以上繰り返し可能であり、変数名を含むとともに前記変数名以外の記述は固定であるボディ部（BODY部）と、固定のXML記述を含むテイル部（TAIL部）とを含むXML文書（仮想的なXML 文書のテンプレート）と、その文章の構造を規定したXMLスキーマに基づく。
【００１６】
本実施形態において、1つのBODY部の中で変数の箇所が複数箇所あるときは、これらの複数の変数をまとめて構造体と呼ぶ。この場合、個々の変数を、構造体メンバと称することもある。本実施形態では、構造体を想定する。
【００１７】
変数名は、タグで囲まれた本文や、タグ内の属性の値の箇所等に記載されている。
【００１８】
制御部（読み込み手段）11は、BODY部の繰り返し回数に応じた個数だけ、構造体の入力データ（入力構造体）を順次読み込む。
【００１９】
HEAD部エンコーダHは、HEAD部の固定のXML記述に対応するEXIビット列を生成する。
【００２０】
BODY部カウンタ12は、入力データの処理回数（つまり何個目の入力構造体を処理したか）をカウントする。
【００２１】
BODY部エンコーダBは、入力データが読み込まれるごとに、BODY部の変数を入力データに置換したXML記述に対応するEXIビット列を生成する。BODY部エンコーダ0は、1回目の入力データ、BODY部エンコーダ1は、2回目以降の入力データを読み込む。これにより、何番目の入力データかに依存したEXIビット列を生成する。詳細は後述する。
【００２２】
TAIL部エンコーダTは、TAIL部の固定のXML記述に応じたEXIビット列を生成する。  より詳細に、本実施形態では、BODY部が0個のときは、TAIL部エンコーダ0が、BODY部が1個以上のときは、TAIL部エンコーダ1が、EXIビット列を生成する。これにより、BODY部の繰り返し回数に依存したEXIビット列を生成する。詳細は後述する。
【００２３】
出力部13は、HEAD部エンコーダにより得られたEXIビット列と、BODY部エンコーダにより得られた0個以上のEXIビット列と、TAIL部エンコーダにより得られたEXIビット列とを順次並べたEXIストリームを出力する。出力されたEXIストリームは、受信装置に送られ、受信装置で復号されることにより、XML文書が復元される。
【００２４】
以下、本実施形態について、さらに詳細に説明する。なお本明細書の末尾にサンプルデータとして例A.1〜A.6を載せてある。適宜、これらを参照する。
【００２５】
図1のEXIエンコーダは、HEAD 部エンコーダH、BODY 部カウンタ12、2 つのBODY 部エンコーダ0，1を含むBODY部エンコーダB、2 つのTAIL 部エンコーダ0，1を含むTAIL部エンコーダT、呼び出し側からの入力に応じてエンコーダを駆動制御する制御部11、および出力部13を備える。入力となる構造体の値（入力データ）は、呼び出し側から与えられ、制御部11が読み込む。
【００２６】
なお、入力となる構造体の形式や、対象とするXML のスキーマによっては、2 つのBODY 部エンコーダ0，1、あるいは2 つのTAIL 部エンコーダ0，1は同一のものとなることもある。
【００２７】
制御部11は、初期化時に、BODY 部カウンタ12をゼロに初期化した上で、HEAD 部エンコーダHを呼び出す。HEAD部エンコーダHは、予め保持している、HEAD部に対応するEXIビット列を出力する。つまり、HEAD 部エンコーダHは、初期化パラメータを入力とし、出力すべきEXIストリームの先頭に相当する、ストリームの初期情報を、EXI 形式で生成する。
【００２８】
その上で、制御部11は、入力となるデータ(構造体) が一つ与えられるごとに、BODY 部エンコーダBにこれを渡す。BODY 部カウンタ12がゼロのときは、BODY 部エンコーダ0 を、非ゼロのときは、BODY 部エンコーダ1 を用いる。BODY部エンコーダ0またはBODY部エンコーダ1は、与えられたデータを元に、EXIビット列を生成し、出力する。より詳細に、BODY 部エンコーダ0またはBODY部エンコーダ1は、入力となる構造体を受け、構造体の各メンバの値を、BODY部の各メンバ名が記載された箇所に記載したXML記述に相当するEXIビット列を生成する。
【００２９】
また、制御部11は、BODY 部エンコーダBにより1つの入力データが処理されるごとに、BODY 部カウンタ12の値をインクリメントする。
【００３０】
また、制御部11は、すべての入力データの処理がBODY部エンコーダBで終わると、TAIL 部エンコーダTを呼び出す。TAIL 部エンコーダTは、BODY 部カウンタ12がゼロのときは（データ（構造体）が入力されなかったときは）、TAIL 部エンコーダ0 を用い、BODY部カウンタ12が非ゼロのときは、TAIL 部エンコーダ1 を用いる。TAIL部エンコーダ0またはTAIL部エンコーダ1は、予め保持している、TAIL部に対応するEXIビット列を出力する。つまり、TAIL 部エンコーダTは、ストリームを閉じる要素（TAIL部のXML記述に相当）を、EXI 形式で生成する。
【００３１】
出力部13は、HEAD部エンコーダH,エンコーダB（BODY部エンコーダ0，1）,TAIL部エンコーダT（TAIL部エンコーダ0または1）からのEXIビット列をまとめて、EXIストリームとし、これを出力する。
【００３２】
図2に、出力されるEXIストリームの構造例を模式的に示す。図2の例は、構造体が3つ（構造体1、構造体2、構造体3）が与えられた場合の例である。図3に、構造体が1つも与えられない場合（HEAD部の次がTAIL部である場合）のEXIストリームの構造例を模式的に示す。
【００３３】
本実施形態ではXML文書を与えることなく、入力構造体を与えるのみで、EXIストリームを生成するが、理解のため、XML文書からEXI形式への変換について説明する。
【００３４】
このXML文書からEXI形式の変換は、XMLスキーマから生成されるEXIの文法(Schema-Informed Grammar [1] Section8.5)に基づく。EXI の文法およびこれにより生成されるEXI ストリームは、次の特徴を持つ。なお、XMLスキーマは、よく知られているように、XML文書の構造を規定するものである。EXI文法は、EXLスキーマから既知の方法で、生成される。
1. XML 文書を、先頭からElement（SEやEEなど）、Attribute（AT）、Characters（CH） などのイベント単位で表現する（たとえばSAXイベントで表現する）
2. EXI文法は、XMLスキーマにより許される状態遷移の数に基づいた文法を持ち、この状態遷移に順にイベントコードを割り付ける
3. 状態遷移の数を表現できる最小限のビット幅の整数で、イベントを表現(オプションに依存)
【００３５】
特徴2 および3 から、送信装置（EXIエンコーダの搭載装置）と、EXIストリームの受信装置が同一のEXI文法を持っていないと、正常な通信が困難である。また通常のXML 処理で見られるように、受信装置側で、未知のタグを読み飛ばすといったことが困難である。
【００３６】
また、以下に挙げるような場合、一見同じ表現であっても状態遷移が異なり、結果として出力されるビット列が、異なる場合がある。
1. オプショナルなXML属性:
存在しても、しなくても良い属性（Attribute ）X がある場合、そのAttribute が登場する直前の状態に対しては、Attribute X が登場する遷移と、次のAttribute あるいはノード（Node）等が登場する遷移が、存在する。つまり、optional Attribute X の後にAttribute Y が登場する文法において、Attribute X が存在した場合のAttribute Y のイベントコードと、Attribute X が存在しない場合のAttribute Y のイベントコードは、異なる場合がある。
2. minOccur=0 のノード:
上記したオプショナルなXML Attribute の場合と同様に、存在しなくてもよいノードがあった場合、その次の要素のイベントコードが変化する場合がある。minOccur=0 のノードは、存在しなくてもよいことを意味する。
3. maxOccur が2 以上のノード:
同じ内容のXML 要素(Node P) であっても、前の要素に対応する文法からNode P に遷移する場合のイベントコードと、Node P からNode P に遷移する場合のイベントコードが異なる場合がある。maxOccur が2以上のノードは、当該回数だけ、繰り返されることが可能であることを意味する（たとえば本実施形態のBODY部がこれに相当）。
【００３７】
ここで、本実施形態で取り扱うXML 文書は、HEAD 部が1 回、BODY 部が0 以上複数回、TAIL 部が1 回の登場となる。
【００３８】
また、HEAD 部・BODY 部・TAIL 部のそれぞれについて、子要素の有無、Attribute の有無が、入力データに依存して、決定される場合がある。
【００３９】
本実施形態によるEXIエンコーダは、EXI 文法とEXI 文法との間の状態遷移のうち、入力の回数および有無によってイベントコードが異なる可能性が出るもの全てに対して、事前にイベントコードを含めたビット列（バイナリ列）を、保持しておくものである。これにより、入力として、データの有無、bool値、ならびにデータの個数によって、ビット列を選択することで、正しくデコード可能な、EXI ストリームを簡易に作成できる。
【００４０】
以下、具体例を用いて、説明を行う。
【００４１】
例A.1 に、仮想XML 文書のテンプレートの例を示す。
【００４２】
この文書では、特に@記号で囲まれている部分が、可変となる部分であり、メンバ名（変数名）が記載されている。また、この文書は、例A.5に示すスキーマに準拠し、このスキーマから、例A.6に示すEXI 文法が導出される。このスキーマ例は、参考文献1（John Schneider and Takuki Kamiya. Efficient XML Interchange (EXI) Format 1.0. W3C  Candidate Recommendation, December 2009. http://www.w3.org/TR/exi/）より引用したものである。節A.6 に示したEXI文法も、参考文献1 より引用したものである。
【００４３】
このEXI文法では、orderに対する文法（「Complete grammar for element <order>」）と、productに対する文法（「Complete grammar for element <product>」）が示される。各文法内でさらに細かく文法が規定されている。<order>に対する文法のTerm_product 0,0、 Term_product 0,1、<product>に対する文法におけるUse_color0等は、文法名である。EXI文法は、LeftHandSide, Terminal, NonTerminal,EventCode（イベントコード） の4 つから構成される。LeftHandSide の状態の時、Terminal のイベントが発生したら、EventCode を出力し、NonTerminal の状態に移行する。
【００４４】
ここで、/order/product タグ(XPath 記法) により示す範囲を、BODY 部(繰り返し部分) とすると、HEAD部、BODY部、TAIL部は、例A.2 に示す構成となる。具体的に、表A.3 に示す3つの構造体（1つの行が1つの構造体に相当し、構造体の各要素が、それぞれメンバ（変数）に相当する）を入力とすると、出力として期待される仮想XML 文書、つまり、EXI ストリームに対応するXML文書は、例A.4 に示すものとなる。
【００４５】
以下、本実施形態では、任意長のビットを「0b」 により始まり、0 および1 の列で表わす。また任意の文字列を「"」で囲んで表記した場合は、これをUTF-8 （XMLで扱われる形式）で表記したバイト列であるとする。
【００４６】
本実施形態によるエンコード処理は、HEAD 部エンコーダHから開始する。
【００４７】
初期化時に、BODY部カウンタ12をゼロに初期化する。HEAD 部エンコーダHは、EXI ヘッダ(通常は2 バイト) に加え、例A.2.1 に相当するEXIビット列を内包している。HEAD部エンコーダHは、内包している当該EXIビット列を、制御部11からの呼び出しに対応して、出力する。
【００４８】
BODY 部エンコーダHは、入力として、例A.3 に示す各行のうち1 行を単位として与えられ、EXIビット列を出力する。BODY 部エンコーダ0 は、1行目のデータ（構造体）が与えられる。BODY部エンコーダ0は、0b0 を出力し、さらにBODY 部の内容をエンコードした結果（BODY部のXML記述において構造体の各メンバ名を、上記1行目のデータで置換したものに対応するEXIビット列）を出力する。
【００４９】
BODY 部エンコーダ1 は、2行目以降のデータが与えられる。2行目以降のデータが与えられたときは、データごとに、0b00 を出力した後、BODY 部の内容をエンコードした結果を出力する。
【００５０】
このように1行目のデータに対しては、最初に0b0を出力し、2行目以降のデータに対しては、最初に0b00を出力するのは、BODY 部カウンタ12がゼロであるときは、文法Term_product 0,0 が対応し、BODY 部カウンタ12が非ゼロであるときは，文法Term_product 1,0 が対応することによる。
【００５１】
BODY 部エンコーダ0 について、以下にさらに詳細に説明する。
【００５２】
BODY 部はproduct タグの開始から始まる。すなわちSE("product") からはじまり、また文法の第一レベルの状態は、0 と1 の2種類(1 ビットで表現できる) ため、BODY 部エンコーダ0は、0b0 を出力する。その後、与えられたデータ（構造体）に応じて、ビット 列 を出力する。また、制御部11は呼び出しBODY 部カウンタ12をインクリメントする。
【００５３】
ここで第一レベルとは、EXIの文法のイベントコードの一番左を指す。たとえば文法Term product 0,0では、イベントコードが以下のように、8個ある。
0
1.0
1.1
1.2
1.3
1.4.0
1.5
1.6
一番左は、0と1のみが存在し（2種類存在し）、よって、第一レベルの状態は1ビットで表現できる。
【００５４】
同様に、文法Term product 1,0では、イベントコードが以下のように4個ある。
0
1
2.0
2.1
一番左は、0と1と2が存在し（3種類存在し）、よって第一レベルの状態は2ビットで表現できる。
【００５５】
制御部11が、2度目に構造体を引数として呼び出された際は、BODY 部カウンタ12が非ゼロであることから、文法Term_product 1,0 が対応する、BODY 部エンコーダ1 を呼び出す。つまり、Term_product 0,0では、SE("product")に対して、イベントコード0を出力して、Term_product 1,0に遷移することを定めている。
【００５６】
ここでは、文法の第一レベルが、上述のように0、1、2 の3 種類存在するため、2 ビットのイベントコードを出力する必要があることが事前にわかっている。BODY 部エンコーダ1 は、同じSE("product") を出力する局面で0b00（イベントコードの0を2ビットで表現したもの） を出力する。以後は、BODY 部エンコーダ0 と同様に、与えられた入力データに応じて、ビット 列 を出力する。また、制御部11は呼び出しBODY 部カウンタ12をインクリメントする。
【００５７】
3度目に、構造体を引数として呼び出されたときは、Term_product 1,0が繰り返されるため、2度目と同様になる。つまり、Term_product 1,0では、SE("product")に対して、イベントコード0を出力した後、同じTerm_product 1,0に遷移することを定めている。
【００５８】
最後に、TAIL 部エンコーダTは、order タグを終了させる。
【００５９】
TAIL 部エンコーダ0 は、BODY部が0回のとき動作し、Term_product0,0 のEE(1.0)、すなわち1 ビット長の1 と、3 ビット長の0 を連結した0b1000 を出力する。つまり1.0の0は第2レベルに相当し、Term_product 0,0では、第2レベルは0,1,2,3,4,5,6の7個存在するから、表現するのに3ビット必要になる。
【００６０】
BODY部が1回でも来ると、Term_product 1,0に遷移し、Term_product 0,0に戻ることはない。 TAIL部エンコーダ1 は、BODY部が1回以上のとき動作し、Term_product 1,0 のEE(1)、すなわち2 ビット長の1 である0b01 を出力する。
【００６１】
以下、BODY 部の内容のエンコード方法、つまりBODY部における構造体の各メンバ名（変数名）を入力データに置換したXML文書に相当するEXIビット列の生成方法について説明する。
【００６２】
本実施形態で採用する文法は、color属性、sku属性、quantity要素、price要素の順にストリームを構築することを期待している（例A.1、例A.2参照）。
【００６３】
また、本実施形態では利用しないが、description要素が存在することもある。
【００６４】
本実施形態では、BODY部の構成は、SKU、COLOR、QUANTITY、PRICE の4 箇所以外は、固定であり、変化しない。従って、事前に通常のEXI エンコード手段によって、BODY部の構造を記述したビット列を作成しておき、変化する部分のみ、入力データと、差し替えれば良い。
【００６５】
BODY 部には、以下の5 つの部分に対応するEXI エンコードされたビット列が保持されている。
1. product タグの開始からsku 属性の内容記述の直前まで
(「<product sku="」に相当)
2. sku 属性の内容記述の直後からcolor 属性の内容記述の直前まで
(「" color="」に相当)
3. color 属性の内容記述の直後からquantity 要素の内容記述直前まで
(「"><quantity>」に相当)
4. quantity 要素の内容記述直後からprice 要素の内容記述直前まで
(「</quantity><price>」に相当)
5. price 要素の内容記述直後からorder タグの終了まで
(「</price></order>」に相当)
【００６６】
それぞれのビット列の間に、入力として与えられた変数（メンバ）のビット列を記述すれば、結果的に、入力データを反映したBODY部をEXI 文法で記述したビット列と同等のものが得られる。BODY部に対応するEXIビット列の構成例を、図4に模式的に示す。
【００６７】
図5は、EXIエンコーダによる動作の流れを示すフローチャートである。
【００６８】
制御部11は、本エンコーダの起動後、HEAD部エンコーダHに出力指示を送り、HEAD部エンコーダHは内包するEXIビット列（HEAD部のXML記述を変換したEXIビット列）を出力部13に送る（S101）。
【００６９】
制御部11は、外部から構造体（複数の変数）のデータの読み込みを試み、データが存在したときは（S102のYES）、読み込んだデータをBODY部エンコーダ0に渡し、BODY部エンコーダ0は、受け取ったデータに基づき、EXIビット列を生成し、出力部13に送る（S103）。そして、制御部11は、BODY部カウンタ12をインクリメントする。
【００７０】
制御部11は、再び、データの読み込みを試み、2番目以降のデータが存在するときは（S104のYES）、そのデータを、BODY部エンコーダ1に送る。BODY部エンコーダ1は、受け取ったデータに基づき、EXIビット列を生成し、出力部13に送る（S105）。そして、制御部11は、入力データがなくなったときは（S104のNO）、TAIL部エンコーダ1に出力指示を出す。TAIL部エンコーダ1は、内包するビット列（TAIL部のXML記述を変換したEXIビット列であって、Term_product 1,0に対応）を出力部13に送る（S106）。
【００７１】
一方、制御部11は、ステップS102での読み込みで、データが存在しなかったときは（S102のNO）、TAIL部エンコーダ0に出力指示を送る。TAIL部エンコーダ0は、内包するビット列（TAIL部のXML記述を変換したEXIビット列であって、Term_product 0,0に対応）を出力する（S107）。
【００７２】
出力部13は、HEAD部エンコーダH、BODY部エンコーダ0，1、TAIL部エンコーダ0，1から受けたEXIビット列を、受け取った順番に並べることにより、EXIストリームとし、受信装置に向けて、出力する（S108）。
【００７３】
以上で説明した方法により、XML 文書を入力として用いることなく、XMLスキーマに基づいた、入力データ（入力構造体）を反映したEXI ストリームを生成できる。
【００７４】
以上、本実施形態によれば、特定のXML スキーマによって与えられるEXI 文法について、専用の効率的なエンコード処理が実施可能になる。特に、XML スキーマで許されたデータ記述の自由度のうち一部しか用いないような種類の処理において、XMLを入力として用いる通常のエンコーダに比べて、格段に効率的なエンコード処理が、実施可能になる。ここでの実施例では簡単のためHEAD/BODY/TAILの形式に限定したが、定数部と変数部との組み合わせ、ならびに構造の繰り返し回数にもとづく定数の変更、という原理は入れ子状に構築したり、2種類以上のBODY部を持つことなども自然な拡張として考えられる。
【００７５】
なお、以上に説明した実施形態におけるEXIエンコーダは、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、EXIエンコーダにおける制御部、BODY部カウンタ、HEAD部エンコーダ、BODY部エンコーダ、TAIL部エンコーダは、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。
【００７６】
このとき、EXIエンコーダは、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
【００７７】
A サンプルデータ
A.1 仮想XML文書のテンプレート例
<?xml>
<order>
<product sku="@SKU@" color="@COLOR@">
<quantity>@QUANTITY@</quantity>
<price>@PRICE@</price>
</product>
</order>
A.2  仮想XML文書のテンプレートの分割例
A.2.1 HEAD 部
<?xml>
<order>
A.2.2 BODY 部
<product sku="@SKU@" color="@COLOR@">
<quantity>@QUANTITY@</quantity>
<price>@PRICE@</price>
</product>
A.2.3 END 部
</order>
A.3 エンコーダへの入力
【表１】
0005166565.tif 000002
A.4 仮想XML文書の具体例
<?xml>
<order>
<product sku="1JB339" color="white">
<quantity>40</quantity>
<price>339.50</price>
</product>
<product sku="1JB340" color="black">
<quantity>25</quantity>
<price>155.0</price>
</product>
<product sku="1JB341" color="green">
<quantity>30</quantity>
<price>183.95</price>
</product>
</order>
A.5 XMLスキーマの例(参考文献1より引用)
<xs:element name="product">
<xs:complexType>
<xs:sequence maxOccurs="2">
<xs:element name="description" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:integer" />
<xs:element name="price" type="xs:float" />
</xs:sequence>
<xs:attribute name="sku" type="xs:string" use="required" />
<xs:attribute name="color" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
<xs:element name="order">
<xs:complexType>
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
A.6 EXI 文法の例(参考文献1より引用)
Complete grammar for element <product>
Event Code
Use_color0 :
AT("color") [schema-typed value] Use_color1      0
AT("sku") [schema-typed value] Use_sku1          1
EE                                               2.0
AT(xsi:type) Use_color0                          2.1
AT(xsi:nil) Use_color0                           2.2
AT (*) Use_color0 2.3
AT("color") [untyped value] Use_color1           2.4.0
AT("sku") [untyped value] Use_sku1               2.4.1
AT (*) [untyped value] Use_color0                2.4.2
SE(*) Use_sku1_copied 2.5
CH [untyped value] Use_sku1_copied               2.6
Use_color1 :
AT("sku") [schema-typed value] Use_sku1          0
EE                                               1.0
AT (*) Use_color1                                1.1
AT("sku") [untyped value] Use_sku1               1.2.0
AT (*) [untyped value] Use_color1                1.2.1
SE(*) Use_sku1_copied                            1.3
CH [untyped value] Use_sku1_copied               1.4
Use_sku1 :
SE("description") Term_description0,1            0
SE("quantity") Term_quantity0,1                  1
EE                                               2.0
AT (*) Use_sku1                                  2.1
AT (*) [untyped value] Use_sku1                  2.2.0
SE(*) Use_sku1_copied                            2.3
CH [untyped value] Use_sku1_copied               2.4
Use_sku1_copied :
SE("description") Term_description0,1            0
SE("quantity") Term_quantity0,1                  1
EE                                               2.0
SE(*) Use_sku1_copied                            2.1
CH [untyped value] Use_sku1_copied               2.2
Term_description0,1 :
SE("quantity") Term_quantity0,1                  0
EE                                               1
SE(*) Term_description0,1                        2.0
CH [untyped value] Term_description0,1           2.1
Term_quantity0,1 :
SE("price") Term_price0,1                        0
EE                                               1
SE(*) Term_quantity0,1                           2.0
CH [untyped value] Term_quantity0,1              2.1
Term_price0,1 :
SE("description") Term_description1,1            0
SE("quantity") Term_quantity1,1                  1
EE                                               2
SE(*) Term_price0,1                              3.0
CH [untyped value] Term_price0,1                 3.1
Term_description1,1 :
SE("quantity") Term_quantity1,1                  0
EE                                               1
SE(*) Term_description1,1                        2.0
CH [untyped value] Term_description1,1           2.1
Term_quantity1,1 :
SE("price") Term_price1,1                        0
EE 1
SE(*) Term_quantity1,1                           2.0
CH [untyped value] Term_quantity1,1              2.1
Term_price1,1 :
EE                                               0
SE(*) Term_price1,1                              1.0
CH [untyped value] Term_price1,1                 1.1
Complete grammar for element <order>
Event Code
Term_product 0,0 :
SE("product") Term_product 1,0                   0
EE                                               1.0
AT(xsi:type) Term_product 0,0                    1.1
AT(xsi:nil) Term_product 0,0                     1.2
AT (*) Term_product 0,0                          1.3
AT (*) [untyped value] Term_product 0,0          1.4.0
SE(*) Term_product 0,0_copied                    1.5
CH [untyped value] Term_product 0,0_copied       1.6
Term_product 0,0_copied :
SE("product") Term_product 1,0                          0
EE                                                      1.0
SE(*) Term_product 0,0_copied                           1.1
CH [untyped value] Term_product 0,0_copied              1.2
Term_product 1,0 :
SE("product") Term_product 1,0                          0
EE                                                      1
SE(*) Term_product 1,0                                  2.0
CH [untyped value] Term_product 1,0                     2.1
【図１】
0005166565.tif 000003
【図２】
0005166565.tif 000004
【図３】
0005166565.tif 000005
【図４】
0005166565.tif 000006
【図５】
0005166565.tif 000007