MRM メッセージとビット・ストリームの処理

ASBITSTREAM 関数または PARSE 文節を指定した CREATE FIELD ステートメントを使用する場合、以下の点に注意してください。

ASBITSTREAM 関数

ASBITSTREAM 関数をコーディングするとき、パーサー・モード・オプションを RootBitStream に設定してメッセージ・ツリーをビット・ストリームに構文解析すると、結果として、メッセージ・フォーマットで指定された形式の MRM 文書がターゲット・エレメントの子から通常の方法で生成されます。

ターゲット・エレメントは、メッセージ・セット内に定義された事前定義メッセージであることが必要ですが、XML 物理形式を使用する場合には自己定義メッセージとすることもできます。 このアルゴリズムは、通常の出力ビット・ストリームを生成する場合と同じです。 この方法で生成した整形式ビット・ストリームを使用して、 CREATE ステートメントで PARSE 文節を使って元のツリーを再作成することができます。

ASBITSTREAM 関数をコーディングするとき、パーサー・モード・オプションを FolderBitStream に設定してメッセージ・ツリーをビット・ストリームに構文解析すると、結果として生成されるビット・ストリームは、ターゲット・エレメントおよびその子から生成される MRM エレメントになります。 RootBitStream モードの場合とは異なり、ターゲット・エレメントはメッセージを表す必要がありません。それはメッセージ内の事前定義メッセージ、またはメッセージ内の自己定義エレメントを表すことができます。

MRM パーサーがメッセージを正しく構文解析できるように、 メッセージからメッセージ内のターゲット・エレメントへのパスが「メッセージ・タイプ」に指定されている必要があります。 パスのフォーマットは、メッセージ・タイプ接頭部が使用されないことを除いて、 メッセージ・パスに使用されるものと同じです。

例えば、以下のメッセージ構造が使用されるとします。
          メッセージ
              elem1
                   elem11
                   elem12

エレメント elem12 とその子を表すサブツリーを直列化するには、 メッセージ・パス 'message/elem1/elem12'「メッセージ・タイプ」に指定します。

パス内のエレメントがネーム・スペースによって修飾される場合、 ネーム・スペース URI をメッセージ・パス内の {} 文字の間に指定します。 例えば、エレメント elem1 がネーム・スペース 'http://www.ibm.com/temp' によって修飾される場合、 メッセージ・パスを 'message/{http://www.ibm.com/temp}elem1/elem12' として指定します。

このモードを使用して、MRM パーサーが所有する任意のサブツリーのビット・ストリーム記述を取得できます。 このモードのとき、物理形式が XML の場合に、 生成される XML ビット・ストリームはメッセージ・セット内のメッセージに対して指定される「ルート・タグ名」によって囲まれません。 メッセージ・セット・プロパティー内で抑制されていない場合でも、XML 宣言は作成されません。

この方法で取得したビット・ストリームを使用すると、PARSE 文節を伴う CREATE ステートメントを使用して、 (FolderBitStream のモードを使用することにより) 元のツリーを再作成することができます。

CREATE ステートメントでの PARSE 文節

CREATE ステートメントで PARSE 文節を使ってコーディングするとき、 パーサー・モード・オプションを RootBitStream に設定して、 ビット・ストリームをメッセージ・ツリーに構文解析すると、 結果として生成されるビット・ストリームは通常の MRM 文書です。 文書の各フィールドごとに、1 つのフィールドがツリー内に作成されます。 このアルゴリズムは、入力ノードからビット・ストリームを構文解析する場合と同じです。

CREATE ステートメントで PARSE 文節を使ってコーディングするとき、 パーサー・モード・オプションを FolderBitStream に設定して、 ビット・ストリームをメッセージ・ツリーに構文解析すると、結果として生成されるビット・ストリームは、 直接指定されるかまたは継承されて「メッセージ形式」で指定されたフォーマットの文書です。 RootBitStream モードの場合とは異なり、文書のルートは MRM メッセージを表す必要がありません。 それはメッセージ内の事前定義メッセージ、またはメッセージ内の自己定義エレメントを表すことができます。

MRM パーサーがメッセージを正しく構文解析できるように、 メッセージからメッセージ内のターゲット・エレメントへのパスが「メッセージ・タイプ」に指定されている必要があります。 メッセージ・パスのフォーマットは、上で説明された ASBITSTREAM 関数に使用されるものと同じです。

ASBITSTREAM 関数および PARSE 文節を指定した CREATE ステートメントを FolderBitStream モードで使用する例

以下の ESQL は、上で説明されたメッセージ定義を使用します。 ESQL は ASBITSTREAM 関数を使用して入力ツリーの一部を直列化してから、 CREATE ステートメントに PARSE 文節を指定して使用し、出力ツリー内にサブツリーを再作成します。 入力メッセージおよび対応する出力メッセージは、ESQL の下に示されています。

CREATE COMPUTE MODULE DocSampleFlow_Compute
CREATE FUNCTION Main() RETURNS BOOLEAN
	BEGIN
CALL CopyMessageHeaders();
		
-- Set the options to be used by ASBITSTREAM and CREATE ... PARSE
-- to be FolderBitStream and enable validation
DECLARE parseOptions INTEGER BITOR(FolderBitStream, ValidateContent,
      ValidateValue, ValidateLocalError);

-- Serialise the elem12 element and its children from the input bitstream
-- into a variable
      DECLARE subBitStream BLOB
        CAST(ASBITSTREAM(InputRoot.MRM.elem1.elem12
        		 OPTIONS parseOptions
        		 SET 'DocSample'
        		 TYPE 'message/elem1/elem12'
        FORMAT 'XML1') AS BLOB);

        -- Set the value of the first element in the output tree
       SET OutputRoot.MRM.elem1.elem11 = 'val11';
       	
       -- Parse the serialized sub-tree into the output tree
        IF subBitStream IS NOT NULL THEN
            CREATE LASTCHILD OF OutputRoot.MRM.elem1
                PARSE ( subBitStream
                        OPTIONS parseOptions
                        SET 'DocSample'
                        TYPE 'message/elem1/elem12'
                        FORMAT 'XML1');
        END IF;
       	
-- Convert the children of elem12 in the output tree to uppercase
SET OutputRoot.MRM.elem1.elem12.elem121 =
UCASE(OutputRoot.MRM.elem1.elem12.elem121);
			
SET OutputRoot.MRM.elem1.elem12.elem122 =
UCASE(OutputRoot.MRM.elem1.elem12.elem122);
			
        -- Set the value of the last element in the output tree
       	SET OutputRoot.MRM.elem1.elem13 = 'val13';				

RETURN TRUE; 
	END;

CREATE PROCEDURE CopyMessageHeaders() BEGIN
DECLARE I INTEGER 1;
DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
WHILE I < J DO
SET OutputRoot.*[I] = InputRoot.*[I];
SET I = I + 1;
END WHILE;
	END;

END MODULE;
入力メッセージ :
<メッセージ>
    <elem1>
        <elem11>value11</elem11>
        <elem12>
            <elem121>value121</elem121>
            <elem122>value122</elem122>
        </elem12>
        <elem13>value13</elem13>
    </elem1>
</message>
出力メッセージ :
<メッセージ>
    <elem1>
        <elem11>val11</elem11>
        <elem12>
            <elem121>VALUE121</elem121>
            <elem122>VALUE122</elem122>
        </elem12>
        <elem13>val13</elem13>
    </elem1
</message
関連概念
メッセージ・フローの概要
ESQL の概要
メッセージのモデル化
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
ESQL ファイルの管理
メッセージ・モデルの開発
関連資料
Compute ノード
Database ノード
Filter ノード
ASBITSTREAM 関数
CREATE ステートメント
SET ステートメント
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ac20701_