XMLNSC ドメインでのメッセージの操作

XMLNSC ドメインは XMLNS ドメインの拡張です (XMLNS ドメインは XML ドメインの拡張です)。

XMLNS ドメインはネーム・スペース・サポートを追加します。XMLNSC ドメインは、よりコンパクトなツリーを作成するので、大きなメッセージを処理する際のメモリー使用量を減らします。既存のアプリケーションは、継続して 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 処理命令とコメントを廃棄し、コンパクトなドメイン・ツリーにエレメントを作成しないようになっています。

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

属性およびタグ付きテキストはどちらも名前値エレメントによって表されるので、 それらはエレメント・タイプの使用方法によって区別されます。タイプを指定しない場合、タグ付きテキストが想定されます。 そのため、前述の最初のメッセージ例は、以下の ESQL ステートメントから生成された可能性があります。
    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.AttributeXMLNSC.SingleAttribute
XMLNSC.DoubleAttribute
次のような XML 入力メッセージがあるとします。
    <Folder1 Item='ValueA'>
        <Item>Value1</Item>
    </Folder1>
Folder1 で名前 Item が属性名とフィールド名の両方に使用されているために生じているあいまいさをなくすには、以下の ESQL を使用できます。
    SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item;
    SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;

この方式は、Folder1 とともに配列指標選択を使用する方式よりも有利です。入力ストリームに属性があるかどうかは問題にならないからです。

混合テキストの処理

デフォルトでは混合テキストは廃棄されます。通常これはフォーマット設定用の空白に過ぎず、ビジネス上の意味を持たないためです。 ただし、構文解析の際に、開始タグと終了タグとの間 (つまり、開始 -> 開始終了 -> 終了、および 終了 -> 開始) に存在するテキスト以外のテキストは、名前のない単一の値エレメントで表されるモードも提供されています。 値エレメント・タイプは PCDATACDATA、 およびこれら 2 つの混合である hybrid をサポートします。

値の取得および設定に関する特別な構文エレメントの動作はありません。 明確にアドレス指定することによってのみ、ESQL から値エレメントにアクセスすることができます。 この目的で、以下の追加の定数が提供されています。
   XMLNSC.Value   XMLNSC.PCDataValue
   XMLNSC.CDataValue
   XMLNSC.HybridValue
モードの制御は、すべてのメッセージ構文解析ノード (MQInput ノードなど) 上の「プロパティー」ビューの「パーサー・オプション」タブにある 「混合内容の保存」プロパティーで行います。メッセージ・オプションを使用したプログラマチックな制御のために、以下の定数が提供されています。
   XMLNSC.MixedContentRetainNone = 0x0000000000000000
   XMLNSC.MixedContentRetainAll  = 0x0001000000000000
これらの定数は、ESQL 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.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.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 ドメインおよびパーサーを使用するには、パス内で 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';
JavaCompute ノードから同じ出力を提供するには、次のコーディング例を使用します。
//Create the XML domain root node
MBElement xmlRoot =
 root.createElementAsLastChild(MbXMLNSC.PARSER_NAME);  

//Create the XML declaration parent node 
MbElement xmlDecl =
 xmlRoot.createElementAsFirstChild(MbXMLNSC.XML_DECLARATION);  


xmlDecl.setName("XmlDeclaration");  

MbElement version =
 xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Version", "1.0"); 
MbElement encoding =
 xmlDecl.CreateElementAsFirstChild(MbXMLNSC.ATTRIBUTE, "Encoding", "utf-8"); 

//Create the message body
このコードによって、出力メッセージに次の行が表示されます。
<?xml version="1.0" encoding="utf_8"?>

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

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

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

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

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

次の表では、各 XML 構文エレメントの相関名が提供されています。 XMLNSC ドメインで作業を行うとき、 これらの名前を使用して入力メッセージのエレメントを参照し、出力メッセージのエレメント、属性、および値を設定します。
構文エレメント 相関名 定数値
フォルダー XMLNSC.Folder 0x01000000
文書タイプ 1 XMLNSC.DocumentType 0x01000300
XML 宣言 2 XMLNSC.XmlDeclaration 0x01000400
     
フィールドまたは属性値 3 XMLNSC.Value 0x02000000
PCData 値 XMLNSC.PCDataValue 0x02000000
CData 値 XMLNSC.CDataValue 0x02000001
Hybrid 値 XMLNSC.HybridValue 0x02000002
     
エンティティー参照 XMLNSC.EntityReference 0x02000100
     
フィールド 3 XMLNSC.Field 0x03000000
PCData XMLNSC.PCDataField 0x03000000
CData XMLNSC.CDataField 0x03000001
Hybrid XMLNSC.HybridField 0x03000002
     
属性 3 XMLNSC.Attribute 0x03000100
単一引用符 XMLNSC.SingleAttribute 0x03000101
二重引用符 XMLNSC.DoubleAttribute 0x03000100
     
ネーム・スペース宣言 XMLNSC.NamespaceDecl 0x03000102
単一引用符 XMLNSC.SingleNamespaceDecl 0x03000103
二重引用符 XMLNSC.DoubleNamespaceDecl 0x03000102
     
ビット・ストリーム・データ XMLNSC.BitStream 0x03000200
     
エンティティー定義 1 3 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';
  3. これらの相関値は、複数の可能なエンティティー・タイプを表し、FIELDTYPE(...) ステートメント内の特定の確認のために使用すべきではありません。 例えば、IF FIELDTYPE(...) = XMLNSC.Attribute THEN ... はエレメントが XMLNSC.SingleAttribute または XMLNSC.DoubleAttribute のいずれかであるため、どれとも一致することはありません。

EntityDefinition および EntityReference の XMLNSC パーサーとの併用

ESQL を使用して、EntityDefinition および EntityReference を XMLNSC パーサーと併用する方法を示した例を 2 つ挙げます。 どちらの例も同じ入力メッセージを使用しています。
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other">
<Identifier>ES39B103T6</Identifier>
</BookInfo>
1 つ目の例は、EntityDefinition および EntityReference を XMLNSC パーサーと併用する方法を示しています。 この例によって次の出力メッセージが生成されます。
<!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 および EntityReference と XMLNSC パーサーを併用して、前述の出力メッセージを生成します。
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
  • エンティティー定義値 edv
  • Identifier の値
これらの変数は、すべて入力メッセージから派生します。XMLNSC.DoubleAttribute コードは二重引用符を Identifier に追加するのに使用され、XMLNSC.SingleAttribute コードは単一引用符を Identifier に追加するのに使用されます。

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, 2009Copyright IBM Corporation 1999, 2009.
最終更新 : 2009-02-20 12:43:00

ac26040_