Mustercode 'XMLNSC Namespaces' erstellen

Mithilfe der Anweisungen in diesem Abschnitt können Sie den Mustercode 'XMLNSC Namespaces' erstellen. Eine andere Möglichkeit besteht darin, die abgeschlossene Nachrichtengruppe und das Nachrichtenbrokerprojekt für den Mustercode zu importieren. Bevor Sie die Anweisungen zur Erstellung des Mustercodes ausführen, müssen Sie die Dateien für den Mustercode 'XMLNSC Namespaces' in Ihren Arbeitsbereich importieren.

So erstellen Sie den Mustercode 'XMLNSC Namespaces':

  1. Erstellen Sie einen Nachrichtensatz namens 'XMLNSCnamespaceMS'. Der Nachrichtensatz verwendet den XMLNSC-Laufzeit-Parser.
    1. Öffnen Sie den Assistenten für eine neue Nachrichtengruppe. Klicken Sie dazu auf eine beliebige Stelle in der Ansicht 'Brokerentwicklung' und anschließend auf Neu > Independent Resources > Nachrichtengruppe (Neue -> Unabhängige Ressourcen -> Nachrichtengruppe).
    2. Legen Sie für den Namen des Nachrichtensatzes XMLNSCnamespaceMS fest.
    3. Klicken Sie auf Finish (Fertigstellen).
    4. Vergewissern Sie sich, dass die standardmäßige Nachrichtendomäne auf XMLNSC gesetzt ist.
    5. Schließen Sie den Nachrichtensatz.
  2. Importieren Sie die XML-Schemadateien in den Nachrichtensatz 'XMLNSCnamespaceMS'. Die XML-Schemadateien enthalten Definitionen für die Nachricht 'SaleListMessage', die in vielen Message Broker-Mustercodes verwendet wird.
    1. Erweitern Sie in der Ansicht 'Brokerentwicklung' das Nachrichtensatzprojekt CHANGENAMESPACEMS.
    2. Wählen Sie die folgenden Dateien:
      • SampleMessage.xsd
      • SampleMessageNamespace1.xsd
      • SampleMessageNamespace2.xsd
    3. Klicken Sie mit der rechten Maustaste auf die ausgewählten Dateien und klicken Sie anschließend auf Kopieren.
    4. Klicken Sie mit der rechten Maustaste auf das Nachrichtensatzprojekt 'XMLNSCnamespaceMS' und klicken Sie dann auf Einfügen. Die XML-Schemadateien werden dem Nachrichtensatz 'XMLNSCnamespaceMS' hinzugefügt.
  3. Erstellen Sie auf Basis der XML-Schemadateien Nachrichtendefinitionsdateien.
    1. Klicken Sie mit der rechten Maustaste auf die Datei SampleMessage.xsd im Nachrichtensatzprojekt 'XMLNSCnamespaceMS' und klicken Sie nacheinander auf Neu > Nachrichtendefinitionsdatei aus > XML-Schemadatei.
    2. Vergewissern Sie sich, dass im Assistenten für die neue Nachrichtendefinitionsdatei SampleMessage.xsd ausgewählt ist, und klicken Sie auf Weiter.
    3. Klicken Sie auf Finish (Fertigstellen).
    4. Wiederholen Sie diese Schritte, um Nachrichtendefinitionsdateien auf Basis der übrigen XML-Schemadateien zu erstellen: SampleMessageNamespace1.xsd und SampleMessageNamespace2.xsd.
  4. Erstellen Sie das Nachrichtenbrokerprojekt XMLNSCnamespaceMF.
  5. Erstellen Sie den Nachrichtenfluss ADDNAMESPACEMF. Dieser Nachrichtenfluss akzeptiert eine Eingabenachricht eines MQInput-Knotens unter Verwendung des XMLNSC-Parsers. Die Eingabenachricht namens 'SalesListMessage' verwendet Namensbereiche. Der Nachrichtenfluss fügt der Nachricht einen Namensbereich hinzu und gibt die aktualisierte Nachricht über einen MQOutput-Knoten aus.
    1. Klicken Sie mit der rechten Maustaste auf das Nachrichtenbrokerprojekt 'XMLNSCnamespaceMF' und klicken Sie auf Neu > Nachrichtenfluss.
    2. Setzen Sie die Option Nachrichtenflussname auf ADDNAMESPACEMF und klicken Sie auf Fertigstellen.
    3. Fügen Sie der Nachrichtenflussgrafik die folgenden Knoten hinzu:
      • 1 MQInput-Knoten
      • 1 Rechenknoten
      • 1 MQOutput-Knoten
    4. Verbinden Sie das Ausgangsterminal des MQInput-Knotens mit dem Eingangsterminal des Rechenknotens.
    5. Verbinden Sie das Ausgangsterminal des Rechenknotens mit dem Eingangsterminal des MQOutput-Knotens.
    6. Konfigurieren Sie die Knoteneigenschaften anhand der nachfolgenden Tabelle.

      Knoten Seite Eigenschaft Value
      MQInput Grundeinstellung Warteschlangenname ADDNAMESPACEMF.IN
      Syntaxanalyse der Eingabenachricht Nachrichtendomäne XMLNSC
      Auswertung Auswerten Übernehmen
      Rechnen Auswertung Auswerten Übernehmen
      MQOutput Grundeinstellung Warteschlangenname

      ADDNAMESPACEMF.OUT


    7. Klicken Sie mit der rechten Maustaste auf den Rechenknoten und klicken Sie auf ESQL öffnen.
    8. Fügen Sie am Anfang der ESQL-Datei (vor dem Modul ADDNAMESPACEMF_Compute) den folgenden ESQL-Code ein. Die ESQL-Funktionen 'ChangeNamespaceInOutputRoot' und 'ChangeNamespace' werden von allen Nachrichtenflüssen im Mustercode verwendet.
      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. Codieren Sie folgenden ESQL-Code für das Hauptmodul:
      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. Speichern Sie ADDNAMESPACEMF.esql und ADDNAMESPACEMF.msgflow.
  6. Erstellen Sie den Nachrichtenfluss CHANGENAMESPACEMF. Dieser Nachrichtenfluss akzeptiert eine Eingabenachricht eines MQInput-Knotens unter Verwendung des XMLNSC-Parsers. Die Eingabenachricht namens 'SalesListMessage' verwendet Namensbereiche. Der Nachrichtenfluss löscht den von der Nachricht verwendeten Namensbereich und gibt die aktualisierte Nachricht über einen MQOutput-Knoten aus.
    1. Klicken Sie mit der rechten Maustaste auf das Nachrichtenbrokerprojekt 'XMLNSCnamespaceMF' und klicken Sie auf Neu > Nachrichtenfluss.
    2. Setzen Sie die Option Nachrichtenflussname auf CHANGENAMESPACEMF und klicken Sie auf Fertigstellen.
    3. Fügen Sie der Nachrichtenflussgrafik die folgenden Knoten hinzu:
      • 1 MQInput-Knoten
      • 1 Rechenknoten
      • 1 MQOutput-Knoten
    4. Verbinden Sie das Ausgangsterminal des MQInput-Knotens mit dem Eingangsterminal des Rechenknotens.
    5. Verbinden Sie das Ausgangsterminal des Rechenknotens mit dem Eingangsterminal des MQOutput-Knotens.
    6. Konfigurieren Sie die Knoteneigenschaften anhand der nachfolgenden Tabelle.

      Knoten Seite Eigenschaft Wert
      MQInput Grundeinstellung Warteschlangenname CHANGENAMESPACEMF.IN
      Syntaxanalyse der Eingabenachricht Nachrichtendomäne XMLNSC
      Auswertung Auswerten Inhalt und Wert
      Rechnen Auswertung Auswerten Übernehmen
      MQOutput Grundeinstellung Warteschlangenname

      CHANGENAMESPACEMF.OUT


    7. Klicken Sie mit der rechten Maustaste auf den Rechenknoten und klicken Sie auf ESQL öffnen.
    8. Ersetzen Sie den ESQL-Code im Modul CHANGENAMESPACEMF_Compute durch folgenden Code:
      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. Speichern Sie CHANGENAMESPACEMF.esql und CHANGENAMESPACEMF.msgflow.
  7. Erstellen Sie den Nachrichtenfluss DELETENAMESPACEMF. Dieser Nachrichtenfluss akzeptiert eine Eingabenachricht eines MQInput-Knotens unter Verwendung des XMLNSC-Parsers. Die Eingabenachricht namens 'SalesListMessage' verwendet Namensbereiche. Der Nachrichtenfluss löscht den von der Nachricht verwendeten Namensbereich und gibt die aktualisierte Nachricht über einen MQOutput-Knoten aus.
    1. Klicken Sie mit der rechten Maustaste auf das Nachrichtenbrokerprojekt 'XMLNSCnamespaceMF' und klicken Sie auf Neu > Nachrichtenfluss.
    2. Setzen Sie die Option Nachrichtenflussname auf DELETENAMESPACEMF und klicken Sie auf Fertigstellen.
    3. Fügen Sie der Nachrichtenflussgrafik die folgenden Knoten hinzu:
      • 1 MQInput-Knoten
      • 1 Rechenknoten
      • 1 MQOutput-Knoten
    4. Verbinden Sie das Ausgangsterminal des MQInput-Knotens mit dem Eingangsterminal des Rechenknotens.
    5. Verbinden Sie das Ausgangsterminal des Rechenknotens mit dem Eingangsterminal des MQOutput-Knotens.
    6. Konfigurieren Sie die Knoteneigenschaften anhand der nachfolgenden Tabelle.

      Knoten Seite Eigenschaft Wert
      MQInput Grundeinstellung Warteschlangenname DELETENAMESPACEMF.IN
      Syntaxanalyse der Eingabenachricht Nachrichtendomäne XMLNSC
      Auswertung Auswerten Inhalt und Wert
      Rechnen Auswertung Auswerten Übernehmen
      MQOutput Grundeinstellung Warteschlangenname

      DELETENAMESPACEMF.OUT


    7. Klicken Sie mit der rechten Maustaste auf den Rechenknoten und klicken Sie auf ESQL öffnen.
    8. Fügen Sie zwischen BEGIN und END beim Modul DELETENAMESPACEMF_Compute den folgenden ESQL-Code hinzu, um die Funktion 'ChangeNamespaceInOutputRoot' aufzurufen:
      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. Speichern Sie DELETENAMESPACEMF.esql und DELETENAMESPACEMF.msgflow.
  8. Implementieren Sie das Nachrichtenbrokerprojekt XMLNSCnamespaceMF auf einem Broker.
    1. Klicken Sie mit der rechten Maustaste auf 'Brokerarchive' und klicken Sie dann auf Neu > Nachrichtenbrokerarchiv.
    2. Wählen Sie ein Serverprojekt und legen Sie für das Brokerarchiv den Namen XMLNSCnamespace.bar fest.
    3. Klicken Sie auf Finish (Fertigstellen).
    4. Fügen Sie das Nachrichtenbrokerprojekt 'XMLNSCnamespaceMF' zu XMLNSCnamespace.bar hinzu.
    5. Speichern Sie die Brokerarchivdatei.
    6. Implementieren Sie XMLNSCnamespace.bar für einen Broker.

Zurück zum Beginn des Mustercodes