XMLNSC Namespaces サンプルの作成

このトピックの指示を使用して、XMLNSC Namespaces サンプルを作成できます。 代わりに、完成しているメッセージ・セットおよびメッセージ・ブローカー・プロジェクトをそのサンプルにインポートすることもできます。 この手順を使用してサンプルを作成する前に、ワークスペースに XMLNSC Namespaces のサンプル・ファイルをインポートしておく必要があります。

XMLNSC Namespaces サンプルを作成するには、次のようにします。

  1. XMLNSCnamespaceMS という名前のメッセージ・セットを作成します。メッセージ・セットは XMLNSC ランタイム・パーサーを使用します。
    1. 「新規メッセージ・セット」ウィザードを開きます。 これを行うには、「ブローカー開発」ビューを右クリックし、「新規」>「独立リソース」>「メッセージ・セット」 をクリックします。
    2. メッセージ・セット名に「XMLNSCnamespaceMS」と設定します。
    3. 「終了」をクリックします。
    4. デフォルトのメッセージ・ドメインが「XMLNSC」に設定されていることを確認してください。
    5. 「メッセージ・セット」を閉じます。
  2. XML スキーマ・ファイルを XMLNSCnamespaceMS メッセージ・セットにインポートします。 XML スキーマ・ファイルには WebSphere Message Broker サンプルの多数で使用されている SaleListMessage メッセージの定義が含まれます。
    1. 「ブローカー開発」ビューで「CHANGENAMESPACEMS」メッセージ・セット・プロジェクトを展開します。
    2. 次のファイルを選択します。
      • SampleMessage.xsd
      • SampleMessageNamespace1.xsd
      • SampleMessageNamespace2.xsd
    3. 選択したファイルを右クリックし、「コピー」をクリックします。
    4. 「XMLNSCnamespaceMS」メッセージ・セット・プロジェクトを右クリックし、 「貼り付け」をクリックします。XML スキーマ・ファイルが XMLNSCnamespaceMS メッセージ・セットに追加されます。
  3. XML スキーマ・ファイルからメッセージ定義ファイルを作成します。
    1. XMLNSCnamespaceMS メッセージ・セット・プロジェクトで SampleMessage.xsd を右クリックし、 「新規」> 「メッセージ定義ファイルの復元」> 「XML スキーマ・ファイル」をクリックします。
    2. 「新規メッセージ定義ファイル」ウィザードで SampleMessage.xsd が選択されていることを確認し、 「次へ」をクリックします。
    3. 「終了」をクリックします。
    4. これらのステップを繰り返し、残りの XML スキーマ・ファイルからメッセージ定義ファイルを作成します (SampleMessageNamespace1.xsd および SampleMessageNamespace2.xsd)。
  4. XMLNSCnamespaceMF メッセージ・ブローカー・プロジェクトを作成します。
  5. 「ADDNAMESPACEMF」メッセージ・フローを作成します。このメッセージ・フローは XMLNSC パーサーを使用して、MQInput ノードからの入力メッセージを受け入れます。 SalesListMessage という名前の入力メッセージではネーム・スペースを使用します。 メッセージ・フローはメッセージにネーム・スペースを追加し、 更新されたメッセージを MQOutput ノードから出力します。
    1. XMLNSCnamespaceMF メッセージ・ブローカー・プロジェクトを右クリックし、 「新規」>「メッセージ・フロー」をクリックします。
    2. メッセージ・フロー名」を ADDNAMESPACEMF に設定し、「終了」をクリックします。
    3. 以下のノードをメッセージ・フロー・キャンバスに追加します。
      • 1 つの MQInput ノード
      • 1 つの Compute ノード
      • 1 つの MQOutput ノード
    4. MQInput ノードの Out ターミナルを Compute ノードの In ターミナルに接続します。
    5. Compute ノードの Out ターミナルを MQOutput ノードの In ターミナルに接続します。
    6. 次の表に示されているように、ノードのプロパティーを構成します。

      ノード ページ プロパティー
      MQInput 基本 キュー名 ADDNAMESPACEMF.IN
      入力メッセージ構文解析 メッセージ・ドメイン XMLNSC
      妥当性検査 妥当性検査 Inherit
      Compute 妥当性検査 妥当性検査 Inherit
      MQOutput 基本 キュー名

      ADDNAMESPACEMF.OUT


    7. Compute ノードを右クリックし、「ESQL を開く」をクリックします。
    8. 以下の ESQL コードを ADDNAMESPACEMF_Compute モジュールより前の、ESQL ファイルの最上部に追加します。 サンプルに含まれているすべてのメッセージ・フローでは、ESQL 関数 ChangeNamespaceInOutputRoot と ChangeNamespace を使用します。
      CREATE FUNCTION ChangeNamespaceInOutputRoot(In rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER)
      BEGIN
      	--
      	-- Need to remove schemalocation and namespace declarations
      	--
      	IF newNamespace = '' THEN
      		SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = NULL;
      		DECLARE I1 INTEGER CARDINALITY(rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[]);
      		DECLARE I2 INTEGER 1;
      		WHILE I2 <= I1 DO
      			SET rootNode.(XMLNSC.Element)*[1].(XMLNSC.NamespaceDecl)*[1] = NULL;
      			SET I2 = I2 + 1;
      		END WHILE;	 
      	ELSE
      	--
      	-- Need to modify the schema locations and the namespace declarations
      	--
      	-- The target schemalocations can be identified within the source message's
      	-- MQRFH2 header, <usr> folder, tag <TargetSchemaLocation>
      	--
      		IF rootNode.(XMLNSC.Element)*[1].*:schemaLocation IS NOT NULL THEN
      			SET rootNode.(XMLNSC.Element)*[1].*:schemaLocation = newNamespace;
      		END IF;	
      	END IF;	
      	--		
      	-- CHECKSIBLING is a flag which, when set to TRUE, ensures that the WHILE loop does an
      	-- unconditional MOVE ... NEXTSIBLING (rather than MOVE ... FIRSTCHILD)
      	-- We need this when we go up a level in the tree... otherwise we go back where we have
      	-- just come from
      	--
      	DECLARE CHECKSIBLING BOOLEAN FALSE;
      	--
      	-- DEPTH determines when to finish.  
      	-- Every time we MOVE FIRSTCHILD we add 1 to DEPTH
      	-- Every time we MOVE PARENT we subtract 1 from DEPTH
      	-- MOVE NEXTSIBLING does not change DEPTH
      	-- Initial value is 1, so we are finished when DEPTH = 0
      	--
      	DECLARE DEPTH INTEGER 1;
      	--
      	-- Walk the tree top to bottom, left to right
      	--
      	WHILE DEPTH <> 0 DO 
      		IF CHECKSIBLING = FALSE THEN 
      			MOVE rootNode FirstChild;
      		 	IF LASTMOVE(rootNode) = TRUE THEN
      				SET DEPTH = DEPTH + 1;
      				CALL ChangeNamespace(rootNode, oldNamespace, newNamespace);
      		 	ELSE
      		 		MOVE rootNode NEXTSIBLING;
      			 	IF LASTMOVE(rootNode) = TRUE THEN
      					CALL ChangeNamespace(rootNode, oldNamespace, newNamespace);
      					SET CHECKSIBLING = FALSE;
      			 	ELSE
      					SET DEPTH = DEPTH - 1;
      					Move rootNode PARENT;		 		
      					SET CHECKSIBLING = TRUE;
      				END IF;
      		 	END IF;	
      		ELSE
      			MOVE rootNode NEXTSIBLING;
      		 	IF LASTMOVE(rootNode) = TRUE THEN
      				CALL ChangeNamespace(rootNode, oldNamespace, newNamespace);
      				SET CHECKSIBLING = FALSE;
      		 	ELSE
      				SET DEPTH = DEPTH - 1;
      				Move rootNode PARENT;		 		
      				SET CHECKSIBLING = TRUE;
      			END IF;
      		END IF;
      	END WHILE;
      END;
      
      CREATE FUNCTION ChangeNamespace(IN rootNode REFERENCE, In oldNamespace CHARACTER, In newNamespace CHARACTER)
      BEGIN
      	--
      	-- Check for elements/attributes with the source namespace		
      	--
          IF (FIELDTYPE(rootNode) = Name) OR (FIELDTYPE(rootNode) = NameValue) THEN
      		IF FIELDNAMESPACE(rootNode) IN (oldNamespace) THEN 
      			--
      			-- Set the new target namespace
      			--
      			SET rootNode NAMESPACE = newNamespace;
      			--
      			-- Get rid of any inline namespace definitions
      			--
      			SET rootNode.(XMLNSC.NamespaceDecl)* = NULL;
      		END IF;
          END IF;
      END;
      
    9. Main モジュール用には以下の ESQL をコーディングします。
      CREATE COMPUTE MODULE ADDNAMESPACEMF_Compute
      
      	CREATE FUNCTION Main() RETURNS BOOLEAN
      	BEGIN
      		DECLARE SourceNamespace NAMESPACE '';
      		DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com';
      
      		CALL CopyMessageHeaders();
      
      DECLARE oldNamespace CHARACTER '';
      		DECLARE newNamespace CHARACTER '';
      		
      		SET oldNamespace = SourceNamespace;
      		SET newNamespace = TargetNamespace;
      
      		IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN
      			SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace;
      		END IF;	
      		-- The target namespace can be specified dynamically in the MQRFH2 header.
      -- The following logic checks whether the MQRFH2 contains this info;  if it does not, 
      -- defaults are supplied in the message flow. 
      				
      		
      				
      		IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN
      			SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace;
      		ELSE	
      			SET newNamespace = TargetNamespace;
      		END IF;	
      				
      		-- Make the output tree the same as the input tree.  
      		SET OutputRoot.XMLNSC = InputBody;
      		
      		-- Change the namespace of the root element.
      		DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC.*[<];
      		CALL ChangeNamespace (rootNode, oldNamespace, newNamespace);
      		
      		-- Alternatively, apply namespaces to local (nested) elements too.
      		-- DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC;
      		-- CALL ChangeNamespace (rootNode, oldNamespace, newNamespace);
      		
      		RETURN TRUE;
      	END;
      
      	CREATE PROCEDURE CopyMessageHeaders()
      	BEGIN
      		DECLARE I INTEGER 1;
      		DECLARE J INTEGER;
      		SET J = CARDINALITY(InputRoot.*[]);
      		WHILE I < J DO
      			SET OutputRoot.*[I] = InputRoot.*[I];
      			SET I = I + 1;
      		END WHILE;
      	END;
      	
      	CREATE PROCEDURE CopyEntireMessage() BEGIN
      		SET OutputRoot = InputRoot;
      	END;
      
      END MODULE;
      
      
    10. ADDNAMESPACEMF.esql および ADDNAMESPACEMF.msgflow を保存します。
  6. 「CHANGENAMESPACEMF」メッセージ・フローを作成します。このメッセージ・フローは XMLNSC パーサーを使用して、MQInput ノードからの入力メッセージを受け入れます。 SalesListMessage という名前の入力メッセージではネーム・スペースを使用します。メッセージ・フローはメッセージで使用されたネーム・スペースを変更し、 更新されたメッセージを MQOutput ノードから出力します。
    1. XMLNSCnamespaceMF メッセージ・ブローカー・プロジェクトを右クリックし、 「新規」>「メッセージ・フロー」をクリックします。
    2. メッセージ・フロー名」を CHANGENAMESPACEMF に設定し、「終了」をクリックします。
    3. 以下のノードをメッセージ・フロー・キャンバスに追加します。
      • 1 つの MQInput ノード
      • 1 つの Compute ノード
      • 1 つの MQOutput ノード
    4. MQInput ノードの Out ターミナルを Compute ノードの In ターミナルに接続します。
    5. Compute ノードの Out ターミナルを MQOutput ノードの In ターミナルに接続します。
    6. 次の表に示されているように、ノードのプロパティーを構成します。

      ノード ページ プロパティー
      MQInput 基本 キュー名 CHANGENAMESPACEMF.IN
      入力メッセージ構文解析 メッセージ・ドメイン XMLNSC
      妥当性検査 妥当性検査 内容と値
      Compute 妥当性検査 妥当性検査 Inherit
      MQOutput 基本 キュー名

      CHANGENAMESPACEMF.OUT


    7. Compute ノードを右クリックし、「ESQL を開く」をクリックします。
    8. CHANGENAMESPACEMF_Compute モジュール内の ESQL を以下のコードで置き換えます。
      CREATE COMPUTE MODULE CHANGENAMESPACEMF_Compute
      	CREATE FUNCTION Main() RETURNS BOOLEAN
      	BEGIN
      		DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com';
      		DECLARE TargetNamespace NAMESPACE 'http://www.samplemessage.brokertest.hursley.ibm.com';
      
      		CALL CopyMessageHeaders();
      
      DECLARE oldNamespace CHARACTER '';
      		DECLARE newNamespace CHARACTER '';
      		
      		SET oldNamespace = SourceNamespace;
      		SET newNamespace = TargetNamespace;
      
      		IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN
      			IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN
      				SET oldNamespace = '';
      			ELSE	
      				SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace;
      			END IF;
      		ELSE	
      			SET oldNamespace = SourceNamespace;
      		END IF;	
      
      		-- The target namespace can be specified dynamically in the MQRFH2 header. -- The following logic checks whether the MQRFH2 contains this info;  if it does not, 
      -- defaults are supplied in the message flow. 
      				
      		
      				
      		IF InputRoot.MQRFH2.usr.TargetNamespace IS NOT NULL THEN
      			IF InputRoot.MQRFH2.usr.TargetNamespace = 'NONAMESPACE' THEN
      				SET newNamespace = '';
      			ELSE	
      				SET newNamespace = InputRoot.MQRFH2.usr.TargetNamespace;
      			END IF;
      		ELSE	
      			SET newNamespace = TargetNamespace;
      		END IF;	
      	
      		-- Make the output tree the same as the input tree.  
      		-- We will then walk the tree changing things as we go   
      
      		SET OutputRoot.XMLNSC = InputBody;
      		DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC;
      		CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace);
      		RETURN TRUE;
      	END;
      
      	CREATE PROCEDURE CopyMessageHeaders() BEGIN
          DECLARE I INTEGER 1;
          DECLARE J INTEGER;
          SET J = CARDINALITY(InputRoot.*[]);
          WHILE I < J DO
            SET OutputRoot.*[I] = InputRoot.*[I];
            SET I = I + 1;
          END WHILE;
        END;
      
      CREATE PROCEDURE CopyEntireMessage()
      	BEGIN
      		SET OutputRoot = InputRoot;
      	END;
      	
      END MODULE;
      
      
    9. CHANGENAMESPACEMF.esql および CHANGENAMESPACEMF.msgflow を保存します。
  7. 「DELETENAMESPACEMF」メッセージ・フローを作成します。このメッセージ・フローは XMLNSC パーサーを使用して、MQInput ノードからの入力メッセージを受け入れます。 SalesListMessage という名前の入力メッセージではネーム・スペースを使用します。 メッセージ・フローはメッセージで使用されたネーム・スペースを削除し、 更新されたメッセージを MQOutput ノードから出力します。
    1. XMLNSCnamespaceMF メッセージ・ブローカー・プロジェクトを右クリックし、 「新規」>「メッセージ・フロー」をクリックします。
    2. メッセージ・フロー名」を DELETENAMESPACEMF に設定し、「終了」をクリックします。
    3. 以下のノードをメッセージ・フロー・キャンバスに追加します。
      • 1 つの MQInput ノード
      • 1 つの Compute ノード
      • 1 つの MQOutput ノード
    4. MQInput ノードの Out ターミナルを Compute ノードの In ターミナルに接続します。
    5. Compute ノードの Out ターミナルを MQOutput ノードの In ターミナルに接続します。
    6. 次の表に示されているように、ノードのプロパティーを構成します。

      ノード ページ プロパティー
      MQInput 基本 キュー名 DELETENAMESPACEMF.IN
      入力メッセージ構文解析 メッセージ・ドメイン XMLNSC
      妥当性検査 妥当性検査 内容と値
      Compute 妥当性検査 妥当性検査 Inherit
      MQOutput 基本 キュー名

      DELETENAMESPACEMF.OUT


    7. Compute ノードを右クリックし、「ESQL を開く」をクリックします。
    8. DELETENAMESPACEMF_Compute モジュールの BEGIN と END の間に以下の ESQL を追加して、ChangeNamespaceInOutputRoot 関数を呼び出します。
      CREATE COMPUTE MODULE DELETENAMESPACEMF_Compute
      	CREATE FUNCTION Main() RETURNS BOOLEAN
      	BEGIN
      		DECLARE SourceNamespace NAMESPACE 'http://www.samplemessage.broker.hursley.ibm.com';
      		DECLARE TargetNamespace NAMESPACE '';
      		
      		CALL CopyMessageHeaders();
      		
      		DECLARE oldNamespace CHARACTER '';
      		DECLARE newNamespace CHARACTER '';
      		
      		SET oldNamespace = SourceNamespace;
      		SET newNamespace = TargetNamespace;
      
      		-- The target namespace can be specified dynamically in the MQRFH2 header. -- The following logic checks whether the MQRFH2 contains this info;  if it does not, 
      -- defaults are supplied in the message flow. 
      				
      		
      				
      		IF InputRoot.MQRFH2.usr.SourceNamespace IS NOT NULL THEN
      			IF InputRoot.MQRFH2.usr.SourceNamespace = 'NONAMESPACE' THEN
      				SET oldNamespace = '';
      			ELSE	
      				SET oldNamespace = InputRoot.MQRFH2.usr.SourceNamespace;
      			END IF;
      		ELSE	
      			SET oldNamespace = SourceNamespace;
      		END IF;	
      				
      		-- Make the output tree the same as the input tree.  
      		-- We will then walk the tree changing things as we go   
      		SET OutputRoot.XMLNSC = InputBody;
      		DECLARE rootNode REFERENCE TO OutputRoot.XMLNSC;
      		CALL ChangeNamespaceInOutputRoot (rootNode, oldNamespace, newNamespace);
      		RETURN TRUE;
      	END;
      
      
      	CREATE PROCEDURE CopyMessageHeaders()
      	BEGIN
      		DECLARE I INTEGER 1;
      		DECLARE J INTEGER;
      		SET J = CARDINALITY(InputRoot.*[]);
      		WHILE I < J DO
      			SET OutputRoot.*[I] = InputRoot.*[I];
      			SET I = I + 1;
      		END WHILE;
      	END;
      	
      	CREATE PROCEDURE CopyEntireMessage() BEGIN
      		SET OutputRoot = InputRoot;
      	END;
      
      END MODULE;
    9. DELETENAMESPACEMF.esql および DELETENAMESPACEMF.msgflow を保存します。
  8. メッセージ・ブローカー・プロジェクト XMLNSCnamespaceMF をブローカーにデプロイします。
    1. 「ブローカー・アーカイブ」を右クリックしてから、「新規」>「メッセージ・ブローカー・アーカイブ」をクリックします。
    2. 「サーバー」プロジェクトを選択し、ブローカー・アーカイブのファイル名を XMLNSCnamespace.bar に設定します。
    3. 「終了」をクリックします。
    4. メッセージ・ブローカー・プロジェクト XMLNSCnamespaceMF を XMLNSCnamespace.bar に追加します。
    5. ブローカー・アーカイブ・ファイルを保存します。
    6. XMLNSCnamespace.bar をブローカーにデプロイします。

サンプルのホームに戻る