(57)【特許請求の範囲】
【請求項１】
EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームを生成するためのEXIエンコーダを生成するコンピュータであって、
XMLスキーマで定義された文書構造における特定箇所と、変数の名前とを互いに対応づけた対応情報を読み込む第1読み込み手段と、
少なくともタグ名を有する複数のタグと、前記特定箇所に配置された置換文字列とを含む教師XML文書を読み込む第2読み込み手段と、
前記教師XML文書を、前記タグ名および前記置換文字列を含む複数の要素のうちの1つを指定したイベントの列に変換するパーサと、
前記イベントの遷移と、EXIイベントコードとの関係を定義したEXI文法書を読み込む第3読み込み手段と、
（A）前記イベントの列を順番に処理して、前記イベントを処理するごとに前記EXI文法書に応じてEXIイベントコードを生成し、
（B）処理するイベントが前記置換文字列を指定するイベントであるときは、前記置換文字列が配置された箇所に対応する前記変数の値を取得する関数を生成し、
（C）前記イベントの列の処理順序に応じて、生成したEXIイベントコードの出力命令コードおよび前記関数の値の出力命令コードを配置することによりEXIエンコーダを生成する、
コードコンポーザと、
を備えたコンピュータ。
【請求項２】
前記関数は、さらに、取得した変数の値を前記XMLスキーマに準拠した形式へ変換する
ことを特徴とする請求項1に記載のコンピュータ。
【請求項３】
前記置換文字列は、前記タグに囲まれた箇所に記載されている
ことを特徴とする請求項1または2に記載のコンピュータ。
【請求項４】
前記教師XML文書における前記タグは属性を有し、
前記置換文字列は、前記属性の値として、記載されている、
ことを特徴とする請求項1ないし2のいずれか一項に記載のコンピュータ。
【請求項５】
前記パーサは、SAXパーサであり、
前記イベントは、SAXイベントである、
ことを特徴とする請求項1ないし4のいずれか一項に記載のコンピュータ。
【請求項６】
前記変数は、構造体の要素である
ことを特徴とする請求項1ないし5のいずれか一項に記載のコンピュータ。
【請求項７】
前記対応情報は、前記特定箇所が含まれる前記教師XML文書の範囲を、タグ名を用いて指定し、
前記コードコンポーザは、前記イベントの列を、前記範囲に対応するボディ部、前記ボディ部より前のヘッド部、および前記ボディ部より後のテイル部に分けて処理を行い、各処理でそれぞれ得られた出力命令コードを結合することにより、前記EXIエンコーダを生成する
ことを特徴とする請求項1ないし5のいずれか一項に記載のコンピュータ。
【請求項８】
EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームを生成するためのEXIエンコーダを生成するコンピュータに実行させるためのプログラムであって、
所定のXMLスキーマで定義された文書構造における特定箇所と、変数の名前とを互いに対応づけた対応情報を読み込む第1読み込みステップと、
少なくともタグ名を有する複数のタグと、前記特定箇所に配置された置換文字列とを含む教師XML文書を読み込む第2読み込みステップと、
前記教師XML文書を、それぞれ前記タグ名および前記置換文字列を含む複数の要素のうちの1つを指定したイベントの列に変換するステップと、
前記イベントの遷移と、EXIイベントコードとの関係を定義したEXI文法書を読み込む第3読み込みステップと、
前記イベントの列を順番に処理して、前記イベントを処理するごとに前記EXI文法書に応じてEXIイベントコードを生成するステップと、
処理するイベントが前記置換文字列を指定するイベントであるときは、前記置換文字列が配置された箇所に対応する前記変数の値を取得する関数を生成するステップと、
前記イベントの列の処理順序に応じて、生成したEXIイベントコードの出力命令コードおよび前記取得関数の値の出力命令コードを配置することによりEXIエンコーダを生成するステップと
をコンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、EXI（Efficient XML(Extensible Markup Language) Interchange）エンコーダを生成するためのエンコーダコンパイラおよびプログラム、ならびにEXIエンコーダを搭載した通信機器に関する。
【背景技術】
【０００２】
従来、ASN.1 の有限状態機械による解釈によりデコーダプログラムを生成するデコーダが知られている。
【０００３】
これと類似した方法で、EXI エンコーダを生成することが考えられる。EXIエンコーダとは、XML文書を効率的にやりとりするため、テキストのXML文書をEXIの仕様にしたがってバイナリ化するエンコーダである。
【０００４】
そのようなEXI エンコーダの利用にあたり、エンコーダにより生成するビット列を、XML 文書の要素と正しく対応づけるには、元となるXML 文書の全ての項目についてエンコードを行う準備を事前に整えておく必要があり、コード量が増加する問題がある。このようなEXIエンコーダを、資源が制約されている組み込み機器に搭載するには、不向きである。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開10-240652号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本発明の一側面は、EXIストリームを低負荷の処理で生成することが可能なEXIエンコーダを生成することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一態様としてのエンコーダコンパイラは、EXI（Efficient XML(Extensible Markup Language) Interchange）ストリームを生成するためのEXIエンコーダを生成するエンコーダコンパイラであって、第1読み込み手段と、第2読み込み手段と、パーサと、第3読み込み手段と、コードコンポーザとを備える。
【０００８】
前記第1読み込み手段は、XMLスキーマで定義された文書構造における特定箇所と、変数の名前とを互いに対応づけた対応情報を読み込む。
【０００９】
前記第2読み込み手段は、少なくともタグ名を有する複数のタグと、前記特定箇所に配置された置換文字列とを含む教師XML文書を読み込む。
【００１０】
前記パーサは、前記教師XML文書を、それぞれ前記タグ名および前記置換文字列を含む複数の要素のうちの1つを指定したイベントの列に変換する。
【００１１】
前記第3読み込み手段は、前記イベントの遷移と、EXIイベントコードとの関係を定義したEXI文法書を読み込む。
【００１２】
前記コードコンポーザは、
（A）前記イベントの列を順番に処理して、前記イベントを処理するごとに前記EXI文法書に応じてEXIイベントコードを生成し、
（B）処理するイベントが前記置換文字列を指定するイベントであるときは、前記置換文字列が配置された箇所に対応する前記変数の値を取得する関数を生成し、
（C）前記イベントの列の処理順序に応じて、生成したEXIイベントコードの出力命令コードおよび前記関数の値の出力命令コードを配置することによりEXIエンコーダを生成する。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施形態に係るエンコーダコンパイラの構成を示す図である。
【図２】EXIエンコーダの生成までの全体の流れを示すフローチャートである。
【図３】専用EXIエンコーダが実行されることで、EXI ストリームが出力される様子を示す図である。
【図４】EXIエンコーダの構成例を示す図である。
【図５】教師XML文書と、HEAD 部・BODY 部・TAIL 部の関係を示す図である。
【図６】エンコーダコンパイラの動作を説明するフローチャートである。
【図７】エンコーダコンパイラにおけるSAXイベントの処理部分のフローチャートである。
【図８】エンコーダコンパイラにおけるBODY 部処理の流れを示したフローチャートである。
【図９】BODY部に対応するエンコード関数の構成例を示す。
【図１０】本発明の実施形態により生成した専用EXIエンコーダを組み込んだ通信機器の構成例を示す。
【発明を実施するための形態】
【００１４】
以下、図面を参照しながら、本発明の実施形態を説明する。なお明細書の末尾にサンプルデータとして節A.1〜A.6を載せてある。適宜、これらを参照する。
【００１５】
図1に、本発明の実施形態に係るエンコーダコンパイラ（エンコーダ生成器）の構成を示す。図2に、EXIエンコーダの生成までの全体の流れを示す。
【００１６】
このエンコーダコンパイラ11は、EXIストリームを生成するためのEXIエンコーダを生成するためのものである。EXIエンコーダは、たとえば資源の限られたスマートメータ等の通信機器に搭載される。このEXIエンコーダを搭載した通信機器では、EXIエンコーダを実行するだけで、XML文書およびXMLスキーマを介することなく、EXIストリームを生成できる。
【００１７】
従来では、通信機器が、EXIストリームを生成するには、相手に送りたい値を書き込んだXML文書を作成し、XML文書をXMLスキーマに基づいて解釈することで、EXIストリームを生成する必要があった。しかしながら、このような処理は、資源の限られた機器（たとえばスマートメータ）には負荷が大きかった。なお、EXIストリームは、相手機器に送られた後は、相手機器で、XMLスキーマに基づきXML文書に復元される。
【００１８】
本実施形態は、この問題を解決するもので、相手に送りたい値（本実施形態では構造体の各要素の値）に基づきEXIエンコーダを実行するだけで、この値を組み込んだEXIストリームを生成できるようにし、このようなEXIエンコーダを（以下、専用EXIエンコーダ）を生成する手段を提案する。これにより資源の制約が厳しい機器において、正規のXML に対応するEXI ストリームを少ない負荷で生成できる。
【００１９】
図1に示されるように、本エンコーダコンパイラ11は、特定のXMLスキーマから生成したEXI文法木と、当該特定のXMLスキーマに準拠したXML文書である教師XML文書と、スキーマ−構造体対応情報と、エンコーダコードテンプレートとを入力とし、EXIエンコーダ（専用EXIエンコーダ）を出力する。エンコーダコンパイラ11は、スキーマ−構造体対応情報を読み込む第1読み込み手段と、教師XML文書を読み込む第2読み込み手段と、EXI文法木を読み込む第3読み込み手段とを含む。第1〜第3読み込み手段の読み込み先は、同じまたは異なる記憶装置である。読み込みは、ネットワークを介して行っても良い。
【００２０】
XML スキーマは、専用EXI エンコーダが出力するEXI ストリームの文書構造を規定するXML スキーマである。教師XML文書の文書構造を規定するXMLスキーマでもある。
【００２１】
節A.5 に、本説明で用いるXML スキーマの例を示す。このスキーマ例は、参考文献1（John Schneider and Takuki Kamiya. Efficient XML Interchange (EXI) Format 1.0. W3C  Candidate Recommendation, December 2009. http://www.w3.org/TR/exi/）より引用したものである。
【００２２】
図2に示すように、XML スキーマはスキーマ分析モジュールによりEXI 文法木に変換され、EXI文法木がエンコーダコンパイラ11に与えられる。なお、EXI 文法木については、参考文献1 の8.5 Schema-informed Grammars などを参照されたい。EXI文法木は、参考文献1の付録H に説明される文法を、木構造として表現したデータである。節A.6 に、本説明で用いるEXI 文法の例を示す(参考文献1 より引用)。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 の状態に移行する。後述のように本実施形態では、XML文書の解釈モデルとしてSAX(Simple API for XML -- http://www.saxproject.org/ ) を想定し、SAXイベントからEXIイベントを生成する。
【００２４】
たとえばorderの開始イベントSE(“order”)が読まれて<order>に対する文法が選択される（この状態をTerm_orderと表記する）。この状態で、次に、SE(“product”)のイベントが来たら、イベントコードとして0（1ビットのゼロ）を出力し、Term_product 1,0に遷移するとともに、productに対する文法が選択される（この状態をTerm_productと表記する）。同様にして、イベントが来るごとに、処理を継続し、EEイベントが来たら、productに対する文法から、orderに対する文法の上記の状態Term_product 1,0に戻り、また同様にして、処理が継続される。なおEXIのイベントコードは1つまたは複数の可変ビット幅非負整数の組によって表現される。個々のイベント番号は、その組み合わせを表現するのに必要十分なビット幅の非負整数により表現される。具体的には、ある文法のイベント番号が7までであれば3ビット、8以上15以下であれば4ビット、等である。また、ピリオドで結合された複数のイベントコード「1.0」「2.1」「2.4.1」などは階層的なイベントコードとなっており、その階層分だけ (個々の階層における必要十分なビット幅の) 可変ビット幅非負整数をならべることにより表現する。なお節A.6の例では、EEイベントは、タグ名の指定がないが、これは現在の文法が指示するタグの終了を確定的に意味する。
【００２５】
教師XML文書は、専用EXI エンコーダの出力内容を規定するものである。XML スキーマが文書に許されている形式を規定するものであるのに対し、教師XML文書は、より具体的にどういった文書を出力するのかを規定するものである。
【００２６】
本実施形態において、出力に含まれる値のうち、変化しない定数などの部分（タグ名や、属性値や本文が定数の場合（なお、節A.1の例では属性値や本文が定数の場合は存在しない））は、教師XML文書に、直接記入する。一方、変化する値 (温度センサにおける温度観測値＋時間、もしくは製品の型番、数量、価格など) は、ポインタとして機能する置換文字列（識別子）を記述する。
【００２７】
置換文字列は、たとえば、開始タグおよび終了タグ間に囲まれた本文の箇所や、タグの属性の値の箇所に、記述される。節A.1 に、教師XML文書の例を示す。@SKU@, @COLOR@,@QUANITTY@,@PRICE@が、それぞれ置換文字列（識別子）に相当する。
【００２８】
スキーマ-構造体対応情報は、XML スキーマならびに教師XML文書のどの部分に、入力となる構造体の要素を対応づけるかを定義する。スキーマ-構造体対応情報は、具体的に、以下の要素から成る。また、節A.2 に、本説明で用いるスキーマ-構造体対応情報の例を示す。なお要素が1つのときは、構造体を用いなくてもよく、この場合は変数を定義すればよい。また本実施形態において構造体の各要素のことをそれぞれ変数と称することもある。
【００２９】
対象タグ:「構造体」に対応するタグの絶対パス(省略・ワイルドカードなしのXPath で表記される)。つまり文書構造において構造体が配置される範囲の指定。
構造体の定義:入力となる「構造体」の定義(C 言語の定義などを利用)。構造体の名前と、構造体の各要素の名前およびその型とを含む。struct productが構造体の名称である。
変換関数:構造体の各要素の値を、教師XML文書の該当箇所に、どのような型で表記するかを定める関数。構造体の要素の型と、教師XML文書の該当箇所とが同じ型を有する場合は、変換は不要であり、構造体の要素の値のみを取得する関数を用いればよい。
【００３０】
節A.2の例では、sku, color, quantity, priceが構造体の名称で、w_char*, int, floatが、構造体の型に相当する。
【００３１】
置換文字列方式では、@SKU@のように教師XML文書と同じ文字列（識別子）が、構造体の要素の名前に対応づけて、記載されている。「wchar2utf8」は、w_char型を、XMLスキーマが使用するutf8型に変換する関数を示している。たとえば、「w_char* sku -> wchar2utf8」は、w_char型の構造体要素skuの値を、utf8型に変換する関数を示している。
【００３２】
このように、本発明の実施形態のエンコーダコンパイラ11は、特定のXML スキーマにもとづく教師XML文書の特定箇所（置換文字列が配置された箇所）に、指定した構造体の要素の値を、指定の型で書き込んだ形のEXI ストリームを生成するための専用EXI エンコーダを生成する。EXIストリームは、EXIイベント列とも称される。
【００３３】
上述のように、専用EXI エンコーダは、通信機器に搭載され、通信機器で1つまたは複数の構造体を入力とし、専用EXIエンコーダが実行されることで、EXI ストリームが出力される。この様子を図3に示す。EXIストリームは、EXIイベントコードと値とのシーケンスである。
【００３４】
通信機器で生成されたEXIストリームは、相手機器に送信される。EXI ストリームは、相手機器でXMLスキーマ（より詳細にはXMLスキーマから生成したEXI文法木）に基づき、デコードすることにより、教師XML文書の特定部分に構造体を格納したXML 文書が得られる。ただし、BODY部（例:節A.1におけるproductタグで囲まれた部分。詳細は後述）は、複数繰り返し可能である（後述する図5参照）。この場合は、教師XML文書のBODY部が繰り返された状態でのXML文書が変換されたEXIストリームが送られる。BODY部が複数繰り返される場合のXML文書の例を、節A.4に示す。
【００３５】
図1に示すように、エンコーダコンパイラ11は、SAXパーサ12と、コードコンポーザ13とを備えている。
【００３６】
SAXパーサ12は、教師XML文書を、SAXイベント列に変換する。
【００３７】
SAXパーサ12は、教師XML文書の先頭から解析をはじめ、文書の開始、要素の開始、属性、要素の終了、文書の終了、などを表すSAXイベント列を生成する。SAXイベントの種類として、タグ開始イベント(属性情報を含む)、タグ終了イベント、文字列イベントなどがある。
【００３８】
たとえば、タグ開始イベントは、タグの開始を示し、当該タグのタグ名を指定し、またタグに含まれる属性の名前と値を指定する。このSAXイベントはEXIイベントにおけるSE(“product”) AT(“color”) などに対応する。タグ終了イベントは、現在のタグの終了を示す。EXIにおけるEEに対応する。文字列イベントは、文字列を指定する。EXIにおけるCHに対応する。SAXについては広く知られているため、これ以上詳細な説明を省略する。また、以後説明の簡単さのため、与えられたSAXイベントを以上のように対応するEXIイベントにより表記する。
【００３９】
SAXパーサ12により生成されたSAXイベント列は、コードコンポーザ13に入力される。本実施形態ではSAXイベントに変換する例を示しているが、本実施形態は、これに限定されず、XML文書をイベント列に変換できるのであれば、どのような方法を用いても良い。
【００４０】
教師XML文書を変換したSAXイベント列は内部的に、（1）〜（3）の3つの部分に分けることができる。  
（1）スキーマ-構造体対応情報が指定するタグの直前（本例では<product>の直前）までのSAXイベント列
（2）当該指定するタグの1 つまたは複数の繰り返しからなるSAXイベント列
（3）当該指定するタグが終了した直後（本例では</product>の直後>から文書の末尾までのSAXイベント列から成る。
【００４１】
節A.2の例ではスキーマ−構造対応情報は、「/order/product」を指定しており、したがって、orderタグの下位のproductタグを指定している。
【００４２】
本説明では、上述（1）のイベント列をHEAD 部、（2）のイベント列をBODY 部、（3）のイベント列をTAIL 部と呼ぶ。教師XML文書と、HEAD 部・BODY 部・TAIL 部の関係を図5に示す。また、節A.3 に、HEAD 部・BODY 部・TAIL 部の例を示す。これは、節A.1 で示した教師XML文書と、節A.2 に示したスキーマ-構造体対応情報から決定されたものである。
【００４３】
コードコンポーザ13は、SAX イベント列を先頭から順番にEXIイベントに変換し、これをEXI 文法木に基づき処理して、イベントを処理するごとに、対応するEXIストリームを生成する出力命令コードを生成する。処理するイベントが、置換文字列を指定するイベントに合致するときは、置換文字列が配置された箇所に対応する構造体の要素の値を取得し変換する関数（型変換が不要なときは、変換は行わなくてよい）を生成する。そして、イベントの列の処理順序に応じてEXIイベントコードの出力命令コードと、当該関数の値の出力命令コードとを配置（組み合わせる）ことで、専用EXIエンコーダを生成する。以下、コードコンポーザ13についてさらに詳しく説明する。
【００４４】
コードコンポーザ13は、処理の間、内包する文法分析用の有限状態機械のスタック(これは、XPath のフルパス、あるいはXML タグの包含関係に対応する) の状態を把握しつつ、処理を行う。
【００４５】
なおHEAD部と、TAIL部には、変動する要素（すなわち置換文字列）が含まれない場合、それぞれ、固定のEXIイベント列が得られる。一方、BODY部では、変動する要素（置換文字列）が含まれるため、通信機器側で構造体の値をEXIストリームに挿入できるようにする必要がある。なお、HEAD部とTAIL部に変動要素が含まれる場合は、本発明で開示するBODY部と同様のアルゴリズムにより動的なEXIイベント列を出力する命令コードを生成できる。
【００４６】
コードコンポーザ13は、イベントの列の処理に応じてられるEXIイベントの列と、個々の処理ステップの時点でのスタック状態を手掛かりに、「専用EXI エンコーダ」を生成する。
【００４７】
この際、エンコーダコードテンプレートを使用する。エンコーダコードテンプレートは、先ほど示したwchar2utf8といった変換関数や、プログラム（命令コード）を記述するのに必要なコードテンプレートを格納している。
【００４８】
たとえば、HEAD部のSAXイベント列から生成されたEXIストリームを書き出す命令コードを、HEAD部出力関数であるencode_Head()の中に記述する。encode_Head()の内部に、HEAD部から生成されたEXIイベント列のビットを記述しておき、encode_Head()を実行することで、HEAD部に対応するEXIイベント列が通信機器で出力される。
【００４９】
また、TAIL部のSAXイベント列から生成されたEXIストリームを書き出す命令コードを、TAIL部出力関数であるencode_Tail()を用いて記述する。encode_Tail()の内部に、Tail部から生成されたEXIイベント列のビットを記述しておき、encode_Tail()を実行することで、Tail部に対応するEXIイベント列が、通信機器で出力される。
【００５０】
同様にボディ部に対しては、BODY部出力関数であるencode_Body()を用いて、BODY部から生成されたEXIストリームを書き出す命令コードを記述する。この際、通信機器側で読み出される構造体の値については、その値を読み込んで（通信機器の内部記憶部等から）、wchar2utf8関数等で、スキーマで定義された形式に符号化して、書き出されるようにする必要がある。たとえば、構造体メンバ（仮にorder->skuとする）については、wchar2utf8(&(order->sku))といったような命令コード（関数）を挿入しておく。(これは構造体orderのskuメンバのアドレスをwchar2utf8関数に渡すことを意味する。)この場合、専用EXIエンコーダを実行する通信機器では、encode_Body()を実行した際、EXIイベント列を順次読み出して書き出すが、途中でwchar2utf8(&(order->sku))を読み出すと、これを実行して、skuに対応する値を読み出して、utf8型に変換して、書き出す。続くEXIイベントが存在すれば、そのEXIイベントを書き出していく。BODY部出力関数の詳細な構成方法は、後述する。
【００５１】
なおここに示した関数の記載形式はあくまで一例であり、本実施形態はこれらの例に限定されるものではない。
【００５２】
これらのencode_Head()、encode_Body()、encode_Tail()を順番に実行するように記述したプログラムの構成例を図4に示す。必要ならば、構造体（sku, colorなど）の定義ファイルをさらに追加記述してもよい。encode_Head()、encode_Body()、およびencode_Tail()の実行結果をつなげることで、出力となるEXIストリームが得られ、通信機器は、これを相手機器に送信する。
【００５３】
コードコンポーザ13は、これら定義ファイルおよびプログラムを含むような専用EXIエンコーダを生成する。通信機器ではこの専用EXIエンコーダを実行することで、自動的に、メモリ内に存在する構造体の値をもとに、取得した構造体の値を組み込んだEXIストリームを生成できる。
【００５４】
図6 はエンコーダコンパイラ11の動作を説明するフローチャートである。
【００５５】
エンコーダコンパイラ11は、教師XML文書をSAXパーサ12によりSAX イベント列に変換する（S11）。またエンコーダコンパイラ11は、専用EXIエンコーダを初期化する（S12）。
【００５６】
HEAD 部に対応するイベントリストHEvent およびTAIL 部に対応するイベントリストTEventを初期化する（S13）。これらのリストは、それぞれHEAD部およびTAIL部から得られたEXI イベントのビット列を格納するためのものである。
【００５７】
なお、これらのリストのビットは、定数として扱われ、出力となる専用EXI エンコーダのプログラムには、上述したように、これらのビットを出力する関数encode_Head()、encode_Tail()が記述されることとなる。
【００５８】
エンコーダコンパイラ11は、SAXイベント列を先頭から処理し、SAX イベントの処理に伴い、文法のスタックを構築する。このスタックはフルパス表記したXPath に相当し、上記スキーマ-構造体対応情報に記述された「対象タグ」（節A.2の例では「product」タグ）に合致した際に、BODY 部の処理を開始する（S17）。
【００５９】
BODY 部の処理を開始する前のSAX イベントは、HEAD 部として処理される（S14のfalse）。HEAD 部の処理は、「EXI エンコーダ：：処理ステップ」(後述) を一つ行い（S15）、その結果をイベントリストHEventに格納する（S16）。この処理を、EXI エンコーダの文法スタックが「対象タグ」に合致するまで続ける。
【００６０】
文法スタックが「対象タグ」に合致したら、その文法スタックが継続している間、「BODY 部処理」により、SAX イベントが処理される（S17）。この処理については複雑になるので後述する。
【００６１】
BODY 部処理終了時に、TAIL 部に対応する可能性のある文法(状態) を得ることができる。この文法を記憶し、文書終了まで、残り部分(TAIL 部分) のSAXイベント列を、EXI イベント列に変換し、イベントリストTEventに格納する（S18、S19、S20）。なお、TAIL部に存在する文法が複数存在するときはそれぞれについてTEventを作成するものとする。
【００６２】
終了処理（S21）では、HEAD 部の定数(HEventリストのデータ)、BODY 部のエンコーダ辞書(後述)、TAIL 部の定数(TEventリストのデータ) を用いて、専用EXI エンコーダを生成する。
【００６３】
図7 は、エンコーダコンパイラ11におけるSAXイベントの処理部分（「EXI エンコーダ：：処理ステップ」）のフローチャートを示す。
【００６４】
本発明の実施形態においては、教師XML文書の内容に応じて、EXI のエンコード方法を切り替えることが特徴の一つであり、そのためにSAX イベント1 つごとに処理を行う。
【００６５】
エンコーダコンパイラ11は、文法構造に基づく状態機械のスタックを管理する必要があり、本フローチャートは、この様子を明示したものである。
【００６６】
一つひとつのイベントの処理については、参考文献1 の第6 章(Encoding EXI Streams) など、公知の内容に基づく。
【００６７】
SAXイベントを一つ取り出すごとに（S51）、EXI文法木によりSAXイベント(対応するEXIイベント)を処理し、EXIストリームの一部分 (イベントコードおよび値の列) を生成する（S52）。
【００６８】
EXIイベントがタグ終了に該当するときは（S53のtrue）、状態遷移スタックをポップ（pop）する（S54）。
【００６９】
EXIイベントがタグ開始に該当するときは（S55のtrue）、開始イベントに対応する状態機械を初期化し、状態機械スタックにプッシュ(push)する(S56)。
【００７０】
タグ終了およびタグ開始のいずれにも該当しないときは、状態機械スタックに対しては何も行うことなく、本フローを終了する。たとえばATイベント、CHイベントに相当するイベントがこの場合に該当する。
【００７１】
図8 は、エンコーダコンパイラ11におけるBODY 部処理（図6のS17）の流れを示したフローチャートである。
【００７２】
BODY 部は、教師XML文書 からひとつ与えられるが、これを再帰的に複数回処理することにより可能性のある文法を発見し、それぞれの文法に対応するサブエンコーダを生成する。つまり節A.1の例ではBODY部が1つ存在するが、実際に通信機器が送信したい内容が節A.4のときは、複数回、BODY部に対するエンコード処理を繰り返す必要がある。繰り返しのたびに同じ文法を使うとは限らないため、可能性のあるそれぞれの文法に対応するBODY部用のエンコーダ（サブエンコーダ）を生成する。
【００７３】
たとえば節A.6の例では、1回目はTerm_product 0,0が用いられるが、2回目以降は、Term_product 1,0が用いられる。このため以下の処理では、節A.6および節A.1の例の場合は、図9に示すように、1回目用のエンコーダ（Term_product 0,0対応関数）と、2回目以降用に適用するエンコーダ（Term_product 0,1対応関数）とを含むBODY部エンコーダ関数が生成される。節A.4の例に則して説明すれば、3つのボディ部の繰り返しのうち、最初のボディ部に対してはTerm_product 0,0対応関数を適用し、残り2つのBODY部に対してはTerm_product 0,1対応関数を適用して、EXIへのエンコードを行うことに相当する。
【００７４】
このように、BODY 部は文法をかえて何度もエンコードしうるため、BODY 部処理開始時点でのSAX ストリーム位置p を記録しておき（S31）、後でストリーム位置をp に復帰させる（S41）。
【００７５】
文法R をキーとする辞書をL[R]と表記する。L[R]は、完成品のエンコーダ（専用EXIエンコーダ）で用いられる、BODY部のサブエンコーダの辞書である。サブエンコーダは、入力となる構造体を、EXI ビット列に変換する機能を含む。
【００７６】
また、終了が確定している(つまり、スキーマによりmaxOccurs（最大回数） が有限であり、かつmaxOccurs回目に出現したタグに対応する) 文法以外は、現在の構造体の次の構造体が入力された際に利用する文法が確定するため、その次の文法の辞書P[R] をあわせて持つ。
【００７７】
全ての文法のうち、BODY 部の開始タグ（たとえば<product>）に対応する文法それぞれを、順にR に代入し、逐次的に以下の処理を行う。
【００７８】
まず、各文法に対して、独立した個別エンコーダを初期化する。ただし、XMLスキーマから生成された文法のうち、R を初期文法として選択するため、ここでは個別エンコーダをE(R)と表記する。
【００７９】
SAX イベント列が、BODY 部タグ終了位置になるまで、以下の処理を継続する（S35のfalse）。
【００８０】
各文法に対するBODY 部の処理は、SAX イベントに「置換文字列」が含まれるかによって分岐する（S36）。置換文字列は、前述したように、教師XML の例における@NAME@ に対応する。置換文字列は、アトリビュート（属性）、あるいはタグで囲まれた本文に対して許される。節A.2 にあるスキーマ-構造体対応情報においては、文字列で記述している例と、相対XPath で記述する例を示している。
【００８１】
もしSAX イベントが置換文字列、つまり構造体に関する情報を含まないのであれば、E(R) によりそのSAX イベントを処理し(S37)、処理の出力をL[R] に追記する（S38）。もしL[R] が存在しなければ、空のリストを初期化し、初期化されたリストに追記する（以下同じ）。
【００８２】
SAX イベントに置換文字列を含む場合も、E(R)を実行するが、これはE(R) が持つ状態を遷移させるためのもので、出力（すなわち置換文字列そのもの）は使わない（S39）。その上で、「置換文字列処理」を行う(S40)。
【００８３】
置換文字列については、本文にある場合（節A.1の例の@QUANTITY@,@PRICE@）と、タグ内のアトリビュート（節A.1の例の@SKU@,@COLOR@）として定義される場合とがある。また、置換方法（構造体のどの要素の値を、どのように変換するか）は、スキーマ-構造体対応情報によって定まる。
【００８４】
この場合、L[R] に、以下のように内容が追記される（S38）。
【００８５】
タグ内のアトリビュートに関しては、現在の文法に基づき生成されたATイベントコード(structurecode)と、スキーマに準拠する型（たとえばスキーマ−構造体対応情報のwchr2utf8の「utf8」）になるように構造体の要素の値を変換する変換関数と、および構造体中の入力となるべき要素を指定する入力要素ポインタ（たとえばスキーマ−構造体対応情報における「sku」）との3 つの組をL[R] に追記する。
【００８６】
一方、XML の本文（タグで囲まれたテキスト文など）については、CHイベントコード、変換関数、入力要素ポインタを、L[R] に登録する(S38)。
【００８７】
変換関数は、スキーマ-構造体対応情報から得られる変換方法に対応する関数である。
【００８８】
節A.2 では、相対XPath方式の例において、w_char 型をutf8 文字列に変換するwchar2utf8 が、構造体要素sku およびcolor に対応している。また、int 型をutf8文字列に変換するint2utf8 が、quantityタグ に囲まれる本文に対応している。また、float 型をutf8 文字列に変換するfloat2utf8 が、priceタグに囲まれた本文に、対応している。
【００８９】
これらの関数は、入力としてC 言語など、エンコーダを記述する言語に基づく型を持ち、出力としてスキーマで許された型をもつことが条件である。その中で実装として単純な変換のみで構成してもよいし、変換関数中で処理(例えばローカルタイムからGMT への変換など) を実施しても良い。
【００９０】
これらの処理を、SAX イベントがBODY 部タグ終了位置になるまで、繰り返す(S35)。なお、SAX イベントがBODY 部タグ終了位置になれば（S35のtrue）、この文法についての処理を終了し、E(R) が現在位置している文法をP[R] に記録し（S33）、SAX ストリーム位置をp に復帰し（S41）、次の文法に処理を移す（S33）。
【００９１】
最終的にBODY 部開始タグに対する処理を全て終えたら、L[R] およびP[R] を、コードコンポーザ13は得る。対応するすべての文法の個数分だけ、L[R] およびP[R]のペアが同数得られることとなる。
【００９２】
ここで、終了処理（図6のS21）においては、L[R] とP[R] から以下のようなコード結合処理が行われる。
【００９３】
まず、BODY部処理の開始位置の文法を初期文法とし、これを内部状態R とする初期化コードを生成する。その上で、以下の処理を実施する命令コード（図9の例の各関数の内容に相当する）を、エンコーダに格納する。  
1. スキーマ-構造体対応情報にて定義される構造体を入力として、L[R]の内容（リスト）を得る。  
2. リストの先頭から順番に以下の処理を行う。  
(a) もし処理対象が定数（たとえばイベントコードのビット）のみであったら、定数を出力する。  
(b) もし処理対象が入力要素ポインタ（構造体を示す）とその変換関数の組であれば、そのポインタが示す値を変換関数に渡し、変換関数の出力をそのまま出力する。
(c) もしリストが終了したら、処理を終了する。
【００９４】
この処理の前に、イベントリストHEventの内容の出力を行う命令コード、後ろにイベントリスTEvent の内容の出力を行う命令コードを組み合わせることで、エンコーダは完成である。
【００９５】
以上のエンコーダコンパイラ11により、特定のXML スキーマによって与えられる文法に対し、教師XML文書による効率的な専用EXIエンコーダを簡便に生成できる。この結果、同一のXML スキーマであっても搭載機器種別毎に利用機能が異なるケースなどにおいて、機器種別毎に最適化したエンコーダを簡便に作成できる。また、個別の搭載機器のID なども含めて教師XML を記載することもでき、機器ひとつひとつに最適化されたエンコーダを生成できる。
【００９６】
また、スマートメータなど、資源の制約が厳しい機器において、正規のXML に対応するEXI ストリームを生成できる。
【００９７】
図10に、本実施形態により生成した専用EXIエンコーダを組み込んだ通信機器の構成例を示す。
【００９８】
本実施形態で生成した専用EXIエンコーダは、スマートメータ等の資源の厳しい通信機器に組み込まれる。
【００９９】
通信機器101は、相手機器との間で効率的なXML文書のやりとりを行うため、相手機器（図示せず）に、送信したいXML文書の内容がエンコードされたEXIストリームを送信する。エンコーダ実行部であるCPU102が、記憶部103内の専用EXIエンコーダをメモリ104に展開して実行する。これにより、図3に示したように、構造体の値が挿入されたEXIストリーム（EXIイベント列）が生成される。つまり、XML文書およびXMLスキーマを用いることなく、低負荷な処理で、EXIストリームが生成できる。通信部105は、このEXIストリームを相手機器に、ネットワークを介して送信する。必要に応じて、暗号化や認証を行っても良い。
【０１００】
なお、以上に説明した実施形態におけるエンコーダコンパイラ11は、例えば、汎用のコンピュータ装置を基本ハードウェアとして用いることでも実現することが可能である。すなわち、エンコーダコンパイラ11におけるSAXパーサ12およびコードコンポーザ13は、上記のコンピュータ装置に搭載されたプロセッサにプログラムを実行させることにより実現することができる。このとき、エンコーダコンパイラ11は、上記のプログラムをコンピュータ装置にあらかじめインストールすることで実現してもよいし、CD−ROMなどの記憶媒体に記憶して、あるいはネットワークを介して上記のプログラムを配布して、このプログラムをコンピュータ装置に適宜インストールすることで実現してもよい。
【０１０１】
A サンプルデータ
A.1 教師XML文書の例
<?xml>
<order>
<product sku="@SKU@" color="@COLOR@">
<quantity>@QUANTITY@</quantity>
<price>@PRICE@</price>
</product>
</order>
A.2 スキーマ-構造体対応情報
置換文字列方式によるもの：
/order/product => struct product {
w_char* sku -> wchar2utf8 | @SKU@;
w_char* color -> wchar2utf8 | @COLOR@;
int quantity -> int2string | @QUANTITY@;
float price -> float2string | @PRICE@;
};
相対XPath 方式によるもの
/order/product => struct product {
w_char* sku -> wchar2utf8 | @sku;
w_char* color -> wchar2utf8 | @color;
int quantity -> int2utf8 | quantity/text();
float price -> float2utf8 | price/text();
};
A.3 教師XML文書の分割例
A.3.1 HEAD 部
<?xml>
<order>
A.3.2 BODY 部
<product sku="@SKU@" color="@COLOR@">
<quantity>@QUANTITY@</quantity>
<price>@PRICE@</price>
</product>
A.3.3 END 部
</order>
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
【図１】
0005325920.tif 000002
【図２】
0005325920.tif 000003
【図３】
0005325920.tif 000004
【図４】
0005325920.tif 000005
【図５】
0005325920.tif 000006
【図６】
0005325920.tif 000007
【図７】
0005325920.tif 000008
【図８】
0005325920.tif 000009
【図９】
0005325920.tif 000010
【図１０】
0005325920.tif 000011