XMLNSC ドメインは、XMLNS ドメインの拡張であり、これはさらに、オリジナルの XML ドメインの拡張です。
XMLNS ドメインはネーム・スペース・サポートを追加します。新規 XMLNSC ドメインは、よりコンパクトなツリーを作成し、それにより、大きなメッセージを処理する際のメモリー使用量を減らします。既存のアプリケーションが影響を受けないように新規ドメインが作成されました。
メッセージ・ツリー構造
<Folder1> <Folder2 Attribute1='AttributeValue1'> <Field1><Value1></Field1> <Field2 Attribute2='AttributeValue2'><Value2></Field2> </Folder2> </Folder1>
XMLNSC ドメインで、これは 2 つの名前エレメント (Folder1 および Folder2)、そして Attribute1、Field1、Field2、および Attribute2 の 4 つの名前値エレメントによって表されます。
<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 処理命令とコメントを廃棄し、コンパクトなドメイン・ツリーにエレメントを作成しないようになっています。
属性およびタグ付きテキスト
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.SingleAttribute XMLNSC.DoubleAttribute
XMLNSC.Attribute
<Folder1 Item='ValueA'> <Item>Value1</Item> </Folder1>
SET ItemAttributeValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Attribute)Item; SET ItemFieldValueHolder = InputRoot.XMLNSC.Folder1.(XMLNSC.Field)Item;
この方式は、Folder1 とともに配列指標選択を使用する方式よりも有利です。入力ストリームに属性がない場合に影響を受けることがないためです。
混合テキストの処理
デフォルトでは、混合テキストが存在しても通常それは単に空白のフォーマット設定だけのためのものでビジネス上の意味はないため、単に廃棄されます。
ただし、構文解析の際に、開始タグと終了タグとの間 (つまり、開始 -> 開始、終了 -> 終了、および 終了 -> 開始) に存在するテキスト以外のテキストは、名前のない単一の値エレメントで表される
モードも提供されています。
値エレメント・タイプは PCDATA、CDATA、
およびこれら 2 つの混合であるハイブリッドをサポートします。
XMLNSC.Value XMLNSC.PCDataValue XMLNSC.CDataValue XMLNSC.HybridValue
XMLNSC.MixedContentRetainNone = 0x0000000000000000 XMLNSC.MixedContentRetainAll = 0x0001000000000000
DECLARE X BLOB ASBITSTREAM(InputRoot.XMLNSC.Data OPTIONS XMLNSC.MixedContentRetainAll); ... CREATE LASTCHILD OF outputRoot PARSE(X OPTIONS XMLNSC.MixedContentRetainNone);
コメントの取り扱い
デフォルトでは、コメントが存在してもそれは意味のない補助的な情報なので、単に廃棄されます。
XMLNSC.Comment
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
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);
既存のフローのマイグレーション
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;
<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 ヘッダーの構成
SET OutputRoot.XML.(XML.XmlDecl)*.(XML.Version)* = '1.0';
SET OutputRoot.XMLNS.(XML.XmlDecl)*.(XML.Version)* = '1.0';
XMLNS パーサーが使用されていますが、 エレメント・タイプ定数は XML パーサーに属するものであることに注意してください。 これが機能するのは、XML および XMLNS パーサーで使用される タイプ値が同じであるためです。 ただし、XMLNSC パーサーではタイプ値が異なるので、 常にそれ自体のタイプ定数を使用する必要があります。
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Version = '1.0';
SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)Encoding = 'UTF-8'; SET OutputRoot.XMLNSC.(XMLNSC.XmlDeclaration)*.(XMLNSC.Attribute)StandAlone = 'Yes';
メッセージ・ツリーのコピー
ツリーをコピーするとき、ブローカーは XML と XMLNSCを異なるパーサーとして扱います。 つまり、ソース・ツリー内のすべての属性はターゲット・ツリー内のエレメントにマップされます。 この状態になるのは、同じフロー内で両方のパーサーを (1 つを入力用に、1 つを出力用に) 使用しているときだけです。この状態の場合、両方のフローのためにコンパクト・パーサーを使用してください。
入力フローと出力フローとで異なるパーサーを使用する必要がある 場合、 パス内のエレメントのタイプを明示的に指定するか、またはFIELDVALUE 関数を使用して サブツリーではなくスカラー値がコピーされるようにしなければならないことがあります。
XML ドメインのメッセージの操作にある XML メッセージに関する指針に従ってください。それとともに、メッセージ本体の内容の操作のトピックにある情報も適用してください。
相関名を使用する XMLNSC ドメイン内の構文エレメントへのアクセス
構文エレメント | 相関名 | 定数値 |
---|---|---|
フォルダー | 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 |
SET OutputRoot.XMLNSC.(XMLNSC.DocumentType)BodyDocument.(XMLNSC.EntityDefinition)TestDef = 'Compact Tree Parser XML Test Module Version 1.0';
-- 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 パーサーと併用する方法
<BookInfo dtn="BookInfo" edn="author" edv="A.N.Other"> <Identifier>ES39B103T6</Identifier> </BookInfo>
<!DOCTYPE BookInfo [<!ENTITY author "A.N.Other">]> <BookInfo><Identifier>ES39B103T7</Identifier><entref>&author;</entref></BookInfo>
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 の値を指すのに使用されます。これらの変数の値は、入力メッセージから派生します。
<!DOCTYPE BookInfo [<!ENTITY author "Book 1">]> <BookInfo Identifier="ES39B103T6">&author;</BookInfo>
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.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);