XMLNSC ドメインは XMLNS ドメインの拡張です (XMLNS ドメインは XML ドメインの拡張です)。
XMLNS ドメインはネーム・スペース・サポートを追加します。XMLNSC ドメインは、よりコンパクトなツリーを作成するので、大きなメッセージを処理する際のメモリー使用量を減らします。既存のアプリケーションは、継続して 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.AttributeXMLNSC.SingleAttribute XMLNSC.DoubleAttribute
<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 つの混合である hybrid をサポートします。
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);
既存のフローの XMLNSC ドメインへのマイグレーション
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';
//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 ドメイン内の構文エレメントへのアクセス
構文エレメント | 相関名 | 定数値 |
---|---|---|
フォルダー | 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 |
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';
EntityDefinition および 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';
以下の 2 つ目の例は、同じ入力メッセージの内容に基づいて、エンティティー定義とそのエンティティーに対する参照を含む出力メッセージを作成する方法を示します。
<!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 パーサー・モード
デフォルトで、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);