|   | 
	 
  
    | 
RSS Feed - WebSphere MQ Support
 | 
RSS Feed - Message Broker Support
 |   
 
  
	     | 
	 | 
   
 
  
	|  Dynamic XML Tag to FIX XML TAG.............................. | 
	« View previous topic :: View next topic »  | 
   
  
  	
	  
		
		
		  | Author | 
		  Message
		 |  
		
		  | geiger | 
		  
		    
			  
				 Posted: Tue Jun 11, 2002 5:37 am    Post subject: Dynamic XML Tag to FIX XML TAG.............................. | 
				     | 
			   
			 
		   | 
		 
		
		   Newbie
 
 Joined: 11 Jun 2002 Posts: 2
  
  | 
		  
		    
			  
				i have han XML with different input in a special tag (dynamic) and i want an fix output in XML:
 
 
Input File:
 
 
<XML>
 
         <TAG1>xxxxx</TAG1>
 
         <TAG2>field2;field3;EMPTY;Field4>
 
<XML>
 
 
Output File:
 
<XML>
 
          <TAG1>xxxxx</TAG1>
 
          <TAG2>
 
                    <FIELD1>field1</FIELD1>
 
                    <FIELD2>field2</FIELD2>
 
                    <FIELD3></FIELD3>
 
                    <FIELD4>field4</FIELD4>
 
          </TAG2>
 
</XML>
 
 
thanks for your help.
 
 
Bruno | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | TorpedoSTu | 
		  
		    
			  
				 Posted: Wed Jun 12, 2002 12:40 am    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		   Acolyte
 
 Joined: 14 Nov 2001 Posts: 73
  
  | 
		  
		    
			  
				use the position function to parse your input XML element and the 'eval' function construct your output. - The ESQL reference guide gives good examples
 
 
i.e.
 
 
(pseudo)
 
declare cnt int
 
declare invar character
 
declare outvar character
 
declare fname character
 
set fname = 'FIELD'
 
set invar = XMLElement
 
start = 1
 
WHILE pos < len(invar)
 
   pos = position(';',invar)
 
   if pos > 0 then
 
      set outvar = substring(invar,1,pos-1) - get data within ';'s
 
      set invar = substring(invar,pos+1) - remove what we've just substringed 
 
      set cnt = cnt + 1
 
      use 'eval' statement to create op element using outvar & cnt
 
      pos = 0
 
   endif
 
loop
 
if len(invar) > 0 -- we've still got to pick up the last one
 
      set cnt = cnt + 1
 
      use 'eval' statement to create op element using invar & cnt
 
end if
 
 
If there are special cases like EMPTY, then you can code to suit
 
 
Hope this helps
 
 
Stu | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | geiger | 
		  
		    
			  
				 Posted: Fri Jun 14, 2002 2:28 am    Post subject: Running version for Dynamic XML to FIX XML | 
				     | 
			   
			 
		   | 
		 
		
		   Newbie
 
 Joined: 11 Jun 2002 Posts: 2
  
  | 
		  
		    
			  
				This is one result of my test.....................................!!!!
 
 
Bruno
 
 
 
SET OutputRoot.XML.XML.TAG2	= InputRoot.XML.XML.TAG2;
 
 
DECLARE InputData INTEGER;
 
DECLARE OutputData INTEGER;
 
 
DECLARE POS INTEGER;
 
DECLARE V1 CHAR;
 
 
DECLARE FELD1 CHAR;
 
DECLARE FELD2 CHAR;
 
DECLARE FELD3 CHAR;
 
DECLARE FELD4 CHAR;
 
 
 
 
 
SET I=1;
 
 
SET V1  = SUBSTRING(InputRoot.XML.XML.TAG2 FROM 1 FOR 40);
 
SET POS = POSITION(';' IN V1);
 
 
 
	IF(POS>0)
 
	-- Wenn ein ; gefunden wurde, wird bis zum ; der Inhalt in die Variable FELD1 kopiert
 
	THEN 	SET FELD1 = SUBSTRING(V1 FROM 1 FOR (POS -1));
 
		ELSE SET FELD1 = '';
 
	END IF;
 
 
		SET V1 = SUBSTRING(V1 FROM POS+1);
 
		SET POS = POSITION(';' IN V1);
 
 
	IF(POS>0)
 
	-- Wenn ein ; gefunden wurde, wird bis zum ; der Inhalt in die Variable FELD2 kopiert
 
	THEN 	SET FELD2 = SUBSTRING(V1 FROM 1 FOR(POS -1));
 
		ELSE SET FELD2 = '';
 
	END IF;
 
 
		SET V1 = SUBSTRING(V1 FROM POS+1);
 
		SET POS = POSITION(';' IN V1);
 
	
 
	IF(POS>0)
 
	-- Wenn ein ; gefunden wurde, wird bis zum ; der Inhalt in die Variable FELD3 kopiert
 
	THEN 	SET FELD3 = SUBSTRING(V1 FROM 1 FOR(POS -1));
 
		ELSE SET FELD3 = '';
 
	END IF;
 
 
		SET V1 = SUBSTRING(V1 FROM POS+1);
 
		SET POS = POSITION(';' IN V1);
 
 
	IF V1<>''	
 
	-- Wenn ein ; gefunden wurde, wird bis zum ; der Inhalt in die Variable FELD4 kopiert
 
	THEN 	SET FELD4 = SUBSTRING(V1 FROM 1);
 
		ELSE SET FELD4 = '';
 
	END IF;
 
 
SET OutputRoot.XML.XML.TAG1        = InputRoot.XML.XML.TAG1;
 
 
SET OutputRoot.XML.XML.TAG2.FIELD1 = FELD1;
 
SET OutputRoot.XML.XML.TAG2.FIELD2 = FELD2;
 
SET OutputRoot.XML.XML.TAG2.FIELD3 = FELD3;
 
SET OutputRoot.XML.XML.TAG2.FIELD4 = FELD4; | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | TorpedoSTu | 
		  
		    
			  
				 Posted: Fri Jun 14, 2002 3:47 am    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		   Acolyte
 
 Joined: 14 Nov 2001 Posts: 73
  
  | 
		  
		    
			  
				Bruno,
 
 
OK you've done it explicitly by only expecting 4 substrings within TAG2, that's OK if there will only ever be 4 entries (i.e. FIELD1, FIELD2, FIELD3, FIELD4). If there are more then I suggest you put in a loop and use the EVAL function. 
 
 
You've also allowed for InputRoot.XML.TAG2 to be 40 characters
 
try changing the Set of V1 to be as follows ....
 
 
SET V1 = InputRoot.XML.TAG2
 
 
I can't see the test for EMPTY in there as per your original question.
 
 
I suggest changing as follws ...
 
 
 
SET POS = POSITION('EMPTY',FELD1)
 
IF POS > 0 THEN
 
SET OutputRoot.XML.XML.TAG2.FIELD1 = ''; 
 
ELSE
 
SET OutputRoot.XML.XML.TAG2.FIELD1 = FELD1; 
 
END IF;
 
 
SET POS = POSITION('EMPTY',FELD2)
 
IF POS > 0 THEN
 
SET OutputRoot.XML.XML.TAG2.FIELD2 = ''; 
 
ELSE
 
SET OutputRoot.XML.XML.TAG2.FIELD2 = FELD2; 
 
END IF;
 
 
SET POS = POSITION('EMPTY',FELD3)
 
IF POS > 0 THEN
 
SET OutputRoot.XML.XML.TAG2.FIELD3 = ''; 
 
ELSE
 
SET OutputRoot.XML.XML.TAG2.FIELD3 = FELD3; 
 
END IF;
 
 
SET POS = POSITION('EMPTY',FELD4)
 
IF POS > 0 THEN
 
SET OutputRoot.XML.XML.TAG2.FIELD4 = ''; 
 
ELSE
 
SET OutputRoot.XML.XML.TAG2.FIELD4 = FELD4; 
 
END IF;
 
 
Let me know if you need the EVAL function version & I'll code it for you.
 
 
Regs
 
 
Stuart | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | TorpedoSTu | 
		  
		    
			  
				 Posted: Fri Jun 14, 2002 4:25 am    Post subject:  | 
				     | 
			   
			 
		   | 
		 
		
		   Acolyte
 
 Joined: 14 Nov 2001 Posts: 73
  
  | 
		  
		    
			  
				Bruno
 
 
Here's the version that I had in mind .....
 
 
DECLARE I INTEGER;
 
SET I = 1;
 
WHILE I < CARDINALITY(InputRoot.*[]) DO
 
	SET OutputRoot.*[I] = InputRoot.*[I];
 
	SET I=I+1;
 
END WHILE;
 
-- Enter SQL below this line.  SQL above this line might be regenerated, causing any modifications to be lost.
 
DECLARE CNT INTEGER;
 
DECLARE POS INTEGER;
 
DECLARE INVAR CHARACTER; 
 
DECLARE OUTVAR CHARACTER; 
 
SET INVAR = InputRoot.XML.XML.TAG2;
 
SET CNT = 0;
 
SET POS = 9999;	
 
WHILE POS > 0 DO
 
	SET POS = POSITION(';' IN INVAR);
 
	IF POS > 0 THEN 
 
		SET OUTVAR = SUBSTRING(INVAR FROM 1 FOR POS-1); 
 
		IF OUTVAR = 'EMPTY' THEN
 
			SET OUTVAR = '';
 
		END IF;
 
		SET INVAR = SUBSTRING(INVAR FROM POS+1);
 
		SET CNT = CNT + 1;
 
		EVAL('SET OutputRoot.XML.XML.FIELD' || CAST(CNT AS CHARACTER) || ' = OUTVAR;');
 
	END IF;
 
END WHILE;
 
IF LENGTH(INVAR) > 0 THEN
 
	IF OUTVAR = 'EMPTY' THEN
 
		SET OUTVAR = '';
 
	END IF;
 
	SET CNT = CNT + 1; 
 
	EVAL('SET OutputRoot.XML.XML.FIELD' || CAST(CNT AS CHARACTER) || ' = INVAR;');
 
END IF;
 
 
 
An Input Message of .....
 
 
<XML><TAG1>xxxxx</TAG1><TAG2>field1;field2;EMPTY;Field4</TAG2><XML> 
 
 
Gives .....
 
 
<XML><FIELD1>field1</FIELD1><FIELD2>field2</FIELD2><FIELD3></FIELD3><FIELD4>Field4</FIELD4></XML>
 
 
Regs
 
 
Stuart | 
			   
			 
		   | 
		 
		
		  | Back to top | 
		  
		  	
		   | 
		 
		
		    | 
		 
		
		  | 
		    
		   | 
		 
	   
	 | 
   
 
  
	     | 
	 | 
	Page 1 of 1 | 
   
 
 
 
  
  	
	  
		
		  
 
  | 
		  You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
  | 
  		 
	   
	 | 
   
 
  	 | 
	  |