XMLNSC パーサーを使用したメッセージの操作

XMLNSC ドメインは、XMLNS ドメインの拡張であり、これはさらに、オリジナルの XML ドメインの拡張です。

XMLNS ドメインはネーム・スペース・サポートを追加します。新規 XMLNSC ドメインは、よりコンパクトなツリーを作成し、それにより、大きなメッセージを処理する際のメモリー使用量を減らします。既存のアプリケーションが影響を受けないように新規ドメインが作成されました。

メッセージ・ツリー構造

XMLNSC パーサーは、 XML および XMLNS パーサーで使用される名前エレメントと値エレメント が別になっているものを使用する代わりに、単一の名前値エレメントを使用して、 タグ付きテキストを表現するための、よりコンパクトなツリーを取得します。 次のメッセージをご覧ください。
    <Folder1>
        <Folder2 Attribute1='AttributeValue1'>
            <Field1><Value1></Field1>
            <Field2 Attribute2='AttributeValue2'><Value2></Field2>
        </Folder2>
    </Folder1>

XMLNSC ドメインで、これは 2 つの名前エレメント (Folder1 および Folder2)、そして Attribute1Field1Field2、および Attribute2 の 4 つの名前値エレメントによって表されます。

変更の始まりXML および XMLNS ドメインは、2 つのフィールド (Field1 および Field2) がそれぞれ値エレメントを子として持つ名前エレメントによって表される点が異なります。変更の終わりこれは小さな相異に思えることがありますが、メッセージにはしばしばそのようなリーフ・フィールドがあります。以下に例を示します。
    <Folder1>
        <Folder2>
            <Field1><Value1></Field1>
            <Field2><Value2></Field2>
            ....
            <Field100><Value100></Field100>
        </Folder2>
    </Folder1>

この場合、XMLNSC パーサーは 2 つの名前および 100 の 名前値エレメントによってメッセージを表し、XML および XMLNS パーサーは 102 の名前エレメントと 100 の値エレメントを使用してメッセージを表すと共に、 さらに 103 の値エレメントを使用してフォーマット済みメッセージ内に暗黙に示された空白を表します。

変更の始まりXML および XMLNS ドメインでは、フォルダーまたはフィールドが終了してから次のフォルダーまたはフィールドが開始するまでの間の空白のフォーマット設定文字のための名前値エレメントが作成されます。これらの空白エレメントには、空の名前と、XML 文書のフォーマット設定に使用されるスペース、タブ、改行、またはその他の文字を表す値があります。これらのエレメントには有効な値がないので、廃棄してさらにコンパクトにできます。同じ理由で、デフォルトの動作では、入力ストリーム中の XML 処理命令とコメントを廃棄し、コンパクトなドメイン・ツリーにエレメントを作成しないようになっています。変更の終わり

属性およびタグ付きテキスト

属性およびタグ付きテキストはどちらも名前値エレメントによって表されるので、 それらはエレメント・タイプの使用方法によって区別されます。 タイプを指定しない場合、タグ付きテキストが想定されます。 そのため、上記の最初のメッセージ例は、以下の SQL ステートメントから生成されます。
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute1 = 
       'AttributeValue1';
    SET Origin.Folder1.Folder2.Field1 = ‘Value1’;
    SET Origin.Folder1.Folder2.(XMLNSC.Attribute)Attribute2 = 
       'AttributeValue2';
    SET Origin.Folder1.Folder2.Field2 = ‘Value2’;

上記の ESQL は XML パーサーで使用されるものとほとんど同一に見えますが、タイプ定数が XMLNSC パーサーに属することに特に注意してください。XML などの他のパーサーに属する定数を使用することは、XML.Attribute などの名前の類似した定数に異なる値があるために、予期しない結果を生じます。

変更の始まり属性を作成するために以下の定数が XMLNSC ドメインで定義されます。
   XMLNSC.SingleAttribute   XMLNSC.DoubleAttribute
変更の終わり
変更の始まり属性を選択するために以下の定数が XMLNSC ドメインで定義されます。
   XMLNSC.Attribute
変更の終わり
変更の始まり次のような XML 入力メッセージがあるとします。
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
変更の終わり
変更の始まりFolder01 で名前 Item が属性名とフィールド名の両方に使用されているために生じているあいまいさをなくすには、以下の ESQL を使用できます。
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
変更の終わり

この方式は、Folder1 とともに配列指標選択を使用する方式よりも有利です。入力ストリームに属性がない場合に影響を受けることがないためです。

混合テキストの処理

変更の始まりデフォルトでは、混合テキストが存在しても通常それは単に空白のフォーマット設定だけのためのものでビジネス上の意味はないため、単に廃棄されます。変更の終わり

ただし、構文解析の際に、開始タグと終了タグとの間 (つまり、開始 -> 開始終了 -> 終了、および 終了 -> 開始) に存在するテキスト以外のテキストは、変更の始まり名前のない単一のエレメントで表される変更の終わりモードも提供されています。 値エレメント・タイプは PCDATACDATA、 およびこれら 2 つの混合であるハイブリッドをサポートします。

値の取得および設定に関する特別な構文エレメントの動作は、まだありません。 エレメントは、明示的にアドレッシングすることにより、SQL からのみアクセスできます。 この目的で、以下の追加の定数が提供されています。
   XMLNSC.Value   XMLNSC.PCDataValue   XMLNSC.CDataValue   XMLNSC.HybridValue
変更の始まりモードの制御は、すべてのメッセージ構文解析ノード (MQInput ノードなど) 上で「XMLNSC パーサー・オプション」プロパティー・ダイアログ・ナビゲーター内の「混合コンテンツ保存モード」を設定することで行います。メッセージ・オプションを使用したプログラマチックな制御のために、以下の定数が提供されています。変更の終わり
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
これらの定数は、SQL CREATE ステートメント (PARSE セクション) およびASBITSTREAM 関数の両方の Option 文節で使用できます。 以下に例を示します。
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS 
   XMLNSC.MixedContentRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS 
   XMLNSC.MixedContentRetainNone);

コメントの取り扱い

デフォルトでは、コメントが存在してもそれは意味のない補助的な情報なので、単に廃棄されます。

変更の始まりただし、構文解析の際に、文書内にあるコメント (文書記述そのものを除く) が Comment という名前の名前値エレメントによって表されるモードも提供されています。この目的で、以下の追加の定数が提供されています。
   XMLNSC.Comment
変更の終わり
変更の始まりモードの制御は、すべてのメッセージ構文解析ノード (MQInput ノードなど) 上で「XMLNSC パーサー・オプション」プロパティー・ダイアログ・ナビゲーター内の「コメント保存モード」を設定することで行います。メッセージ・オプションを使用したプログラマチックな制御のために、以下の定数が提供されています。変更の終わり
   XMLNSC.CommentsRetainNone = 0x0000000000000000
   XMLNSC.CommentsRetainAll  = 0x0002000000000000
以下に例を示します。
   DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS 
   XMLNSC.CommentsRetainAll);
   ...
   CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.CommentsRetainNone);

処理命令の取り扱い

デフォルトでは、処理命令が存在してもそれは意味のない補助的な情報なので、単に廃棄されます。

ただし、構文解析の際に、文書内にある処理命令 (文書記述そのものを除く) が適切な名前と値を持つ名前値エレメントによって表されるモードも提供されています。この目的で、以下の追加の定数が提供されています。
    XMLNSC.ProcessingInstruction
変更の始まりモードの制御は、すべてのメッセージ構文解析ノード (MQInput ノードなど) 上で「XMLNSC パーサー・オプション」プロパティー・ダイアログ・ナビゲーター内の「処理命令保存モード」を設定することで行います。メッセージ・オプションを使用したプログラマチックな制御のために、以下の定数が提供されています。変更の終わり
    XMLNSC.ProcessingInstructionsRetainNone = 0x0000000000000000
    XMLNSC.ProcessingInstructionsRetainAll  = 0x0004000000000000
以下に例を示します。
    DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data 
    OPTIONS XMLNSC.ProcessingInstructionsRetainAll);
    ...
    CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS 
    XMLNSC.ProcessingInstructionsRetainNone);

既存のフローのマイグレーション

変更の始まり新規の XMLNSC ドメインおよびパーサーを使用するには、パス内で XMLNSC を使用するように ESQL を再コーディングする必要があります。次の ESQL ステートメントをご覧ください。
SET OutputRoot.XML.Person.Salary    = CAST(InputRoot.XML.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNS.Person.Salary  = CAST(InputRoot.XMLNS.Person.Salary AS INTEGER) * 3;
SET OutputRoot.XMLNSC.Person.Salary = CAST(InputRoot.XMLNSC.Person.Salary AS INTEGER) * 3;
変更の終わり
変更の始まりそれぞれの場合に、入力キューでは XML ビット・ストリームが予期されて、 出力キューへは以下の形式で書き込まれます。
    <Person><Salary>42</Salary></Person>
変更の終わり

変更の始まり3 つの ESQL の例は、これらのエレメントを取得するために異なるパーサーを使用する点が異なります。所有パーサーの設定は、着信メッセージの MQRFH2 ヘッダーの <mcd> フォルダーでメッセージ・セット・ドメインを指定するか、フロー入力ノードの「デフォルト」プロパティーでメッセージ・セット・ドメインを定義することにより行えます。これらのドメイン定義が両方ともある場合は、MQRFH2 ヘッダーの <mcd> フォルダー内のメッセージ・セット・ドメインの値が優先されます。変更の終わり

変更の始まりXMLNSC ドメインにマイグレーションする場合、MQRFH2 ヘッダーを使用しているのであれば、<mcd> フォルダーの <Msd> フィールドに新しいドメイン名が必要です。出力メッセージの MQRFH2 ヘッダーに新しいドメイン名があることに注意してください。外部アプリケーションをこれらの変更から保護するため、「XMLNSC コンパクト・パーサーを XMLNS ドメインに使用」プロパティーをフローの入力ノードおよび Compute ノードか Mapping ノードに指定できます。これらのプロパティーを設定すると、<Msd> フィールド値を XMLNS のままにできるので、入出力メッセージには変更はありません。フローはコンパクト・パーサーを使用するようになり、ESQL パスは XMLNSC を使用してコーディングされます。変更の終わり

変更の始まり着信メッセージに MQRFH2 ヘッダーが含まれず、入力ノードのメッセージ・ドメイン・プロパティーがドメインの指定に使用される場合、フローの入力ノードのドメイン・プロパティーを直接 XMLNSC に設定して XMLNSC ドメインにマイグレーションするか、または XMLNS のままにして「XMLNSC コンパクト・パーサーを XMLNS ドメインに使用」プロパティーを設定できます。フローではコンパクト・パーサーが使用され、これらのどちらかの設定を指定することにより XMLNSC を使用して ESQL パスをコーディングしなければなりません。変更の終わり

変更の始まり出力メッセージに MQRFH2 ヘッダーが含まれない場合、ドメインは出力メッセージ内のどこにも出現せず、Compute ノードの「XMLNSC コンパクト・パーサーを XMLNS ドメインに使用」プロパティーを設定してもその効果はありません。変更の終わり

XML ヘッダーの構成

以下の ESQL は、XML ドメイン内で有効です。
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
XMLNS にマイグレーションするには、ルートを変更するだけでこれが機能します。
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';

XMLNS パーサーが使用されていますが、 エレメント・タイプ定数は XML パーサーに属するものであることに注意してください。 これが機能するのは、XML および XMLNS パーサーで使用される タイプ値が同じであるためです。 ただし、XMLNSC パーサーではタイプ値が異なるので、 常にそれ自体のタイプ定数を使用する必要があります

XMLNSC ドメインでは、XML バージョン用の特別なタイプはありません。それは単に XML 宣言の属性として扱われます。 上記の例と同等の構文は、以下のとおりです。
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
変更の始まりXMLNSC ドメインと同様、XML エンコード方式タイプと XML スタンドアロン・モードも、単に XML 宣言の属性として処理され、以下のように ESQL でセットアップできます。
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
変更の終わり

メッセージ・ツリーのコピー

ツリーをコピーするとき、ブローカーは XMLXMLNSCを異なるパーサーとして扱います。 つまり、ソース・ツリー内のすべての属性はターゲット・ツリー内のエレメントにマップされます。 この状態になるのは、同じフロー内で両方のパーサーを (1 つを入力用に、1 つを出力用に) 使用しているときだけです。この状態の場合、両方のフローのためにコンパクト・パーサーを使用してください。

入力フローと出力フローとで異なるパーサーを使用する必要がある 場合、 パス内のエレメントのタイプを明示的に指定するか、またはFIELDVALUE 関数を使用して サブツリーではなくスカラー値がコピーされるようにしなければならないことがあります。

XML ドメインのメッセージの操作にある XML メッセージに関する指針に従ってください。それとともに、メッセージ本体の内容の操作のトピックにある情報も適用してください。

相関名を使用する XMLNSC ドメイン内の構文エレメントへのアクセス

次の表では、各 XML 構文エレメントの相関名が提供されています。 XMLNSC ドメインで作業を行うとき、 これらの名前を使用して入力メッセージのエレメントを参照し、出力メッセージのエレメント、属性、および値を設定します。
表 1. XML 構文エレメントの相関名
構文エレメント 相関名 定数値
フォルダー XMLNSC.Folder 0x01000000
文書タイプ 1 XMLNSC.DocumentType 0x01000300
XML 宣言 2 XMLNSC.XmlDeclaration 0x01000400
     
フィールドまたは属性値 XMLNSC.Value 0x02000000
PCData 値 XMLNSC.PCDataValue 0x02000000
CData 値 XMLNSC.CDataValue 0x02000001
Hybrid 値 XMLNSC.HybridValue 0x02000002
     
エンティティー参照 XMLNSC.EntityReference 0x02000100
     
フィールド XMLNSC.Field 0x03000000
PCData XMLNSC.PCDataField 0x03000000
CData XMLNSC.CDataField 0x03000001
Hybrid XMLNSC.HybridField 0x03000002
     
属性 XMLNSC.Attribute 0x03000100
単一引用符 XMLNSC.SingleAttribute 0x03000101
二重引用符 XMLNSC.DoubleAttribute 0x03000100
     
ネーム・スペース宣言 XMLNSC.NamespaceDecl 0x03000102
単一引用符 XMLNSC.SingleNamespaceDecl 0x03000103
二重引用符 XMLNSC.DoubleNamespaceDecl 0x03000102
     
ビット・ストリーム・データ XMLNSC.BitStream 0x03000200
     
エンティティー定義 1 XMLNSC.EntityDefinition 0x03000300
単一引用符 XMLNSC.SingleEntityDefinition 0x03000301
二重引用符 XMLNSC.DoubleEntityDefinition 0x03000300
     
コメント XMLNSC.Comment 0x03000400
     
処理命令 XMLNSC.ProcessingInstruction 0x03000401
注:
  1. 文書タイプは、エンティティー定義にのみ使用されます。 以下に例を示します。
    SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument.(XMLNSC.EntityDefinition)TestDef =
    		          'Compact Tree Parser XML Test Module Version 1.0';
  2. XML 宣言は、バージョンその他に対する子エレメントを含む特別なフォルダー・タイプです。以下に例を示します。
    -- Create the XML declaration
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Version = 1.0;
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Encoding = 'UTF8';
    SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.Standalone = 'yes';

変更の始まりEntityDefintion および EntityReference を XMLNSC パーサーと併用する方法変更の終わり

変更の始まりESQL を使用して、EntityDefintion および EntityReferenceXMLNSC パーサーと併用する方法を示した例を 2 つ挙げます。両方の例とも同じ入力メッセージを使用しています。
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
変更の終わり
変更の始まり1 つ目の例は、EntityDefintion および EntityReferenceXMLNSC パーサーと併用する方法を示しています。この例によって生成される出力メッセージは以下のとおりです。
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]>
<BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
変更の終わり
変更の始まり以下の ESQL の XMLNSC.EntityDefinition は、ハードコーディングされているエンティティー author の定義に使用します。その値 A.N.Other は入力メッセージ中の edv から派生します。XMLNSC.EntityReference は、XML メッセージ本体中でのエンティティー author に対する参照の作成に使用されます。
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.BookInfo.Identifier = cursor.Identifier;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = 'author';
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)author VALUE = cursor.edv;
SET OutputRoot.XMLNSC.(XMLNSC.BookInfo).entref.(XMLNSC.EntityReference)* = 'author';
変更の終わり

変更の始まり変数 cursor は、変数 dtn (文書タイプ名)、edv (エンティティー定義値)、および Identifier の値を指すのに使用されます。これらの変数の値は、入力メッセージから派生します。変更の終わり

変更の始まり以下の 2 つ目の例は、同じ入力メッセージの内容に基づいて、エンティティー定義とそのエンティティーに対する参照を含む出力メッセージを作成する方法を示します。 この例によって生成される出力メッセージは以下のとおりです。author というエンティティー定義と、XML メッセージ本体中のこのエンティティーに対する参照が示されています。
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]>
<BookInfo Identifier="ES39B103T6">&author;</BookInfo>
変更の終わり
変更の始まり以下の ESQL は、EntityDefintion および EntityReferenceXMLNSC パーサーを併用して、前述の出力メッセージを生成します。
SET OutputRoot.MQMD = InputRoot.MQMD;
DECLARE cursor REFERENCE TO InputRoot.XMLNSC.BookInfo;
CREATE FIELD OutputRoot.XMLNSC.BookInfo;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)* NAME = cursor.dtn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* NAME = cursor.edn;
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)*.(XMLNSC.EntityDefinition)* VALUE = 'Book 1';
SET OutputRoot.XMLNSC.(XMLNSC.Folder)*[<].(XMLNSC.EntityReference)* = cursor.edn;
SET OutputRoot.XMLNSC.Identifier.(XMLNSC.DoubleAttribute)Identifier = cursor.Identifier;
変更の終わり

変更の始まりXMLNSC.EntityDefinition は、値 Book 1 を持つエンティティー author の定義に使用されます。さらに、XMLNSC.EntityReference を使用して、メッセージ中に author エンティティーに対する参照が作成されます。変数 cursor は、変数 dtn (文書タイプ名)、edn (エンティティー定義名)、および Identifier の値を指すのに使用されます。これらの変数は、すべて入力メッセージから派生します。XMLNSC.DoubleAttribute コードは、二重引用符を Identifier に追加するのに使用されます。Identifier にだけ単一引用符を追加するには、XMLNSC.SingleAttribute を使用できます。変更の終わり

XMLNSC パーサー・モード

デフォルトで、XMLNSC パーサーは通常ビジネス上の意味を持たない文書エレメントを廃棄します。 ただし、これらのエレメントの保持を強制するパーサー・モードが使用可能です。 これらのモードをノードのプロパティーに構成して、メッセージを XMLNSC ドメインで構文解析することを指定できます。

XMLNSC パーサーの有効なパーサー・モードは、以下のとおりです。
XMLNSC.MixedContentRetainNone
XMLNSC.MixedContentRetainAll
XMLNSC.CommentsRetainNone
XMLNSC.CommentsRetainAll
XMLNSC.ProcessingInstructionsRetainNone
XMLNSC.ProcessingInstructionsRetainAll
以下の例では、XMLNSC.ProcessingInstructionsRetainAll および XMLNSC.ProcessingInstructionsRetainNone モードを 使用して、構文解析の際に文書処理命令を保持します。
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.ProcessingInstructionsRetainAll);
...     
CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.ProcessingInstructionsRetainNone);
関連概念
メッセージ・フローの概要
XML パーサーおよびドメイン
ESQL の概要
関連タスク
メッセージ・フローの設計
メッセージ・フローの内容の定義
XML ドメインのメッセージの操作
関連資料
ESQL 参照
SET ステートメント
FIELDVALUE 関数
ASBITSTREAM 関数
CREATE ステートメント
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
ac26040_