cancel
Showing results for 
Search instead for 
Did you mean: 

Java Mapping - How to End XML tag and Start again

Former Member
0 Kudos

Hi Experts ,

I am trying to write code using Java Mapping in SAP NWDS . I am using DOM parser method .

Please find the below sample Input and expected Outputs . I need to end an XML tag and Start it again based on some logic .

Can you please help with the code so that I can  manipulate the XML ?

Input XML :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID/>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

      </ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

Expected Output :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

        </ns1:MT_Test>       

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID/>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

      </ns1:MT_Inventory_Test>

   </ns0:Message1>

</ns0:Messages>

Accepted Solutions (1)

Accepted Solutions (1)

anupam_ghosh2
Active Contributor
0 Kudos

Thank you for marking my answer as correct answer but I expected a thank you note from you.

Anyways keep smiling. All the best.

Former Member
0 Kudos

Hi Anupam ,

I already acknowledged the prompt response . However , I checked more cases and the issue is not resolved and I have replied on the same. Can you please help ?

Regards

Abhishek

anupam_ghosh2
Active Contributor
0 Kudos

No issues Abhishek. I had to sort the nodes before coming to the solution.

Thank you for posting a challenging question. Node "Seller_ID" should be of occurrence (1..1), it is a mandatory node. In case this value is missing in source the mapping will fail. 


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.AbstractTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

import com.sap.aii.mapping.api.TransformationInput;

import com.sap.aii.mapping.api.TransformationOutput;

public class RepeatNode1 extends AbstractTransformation{

  Document docOut;

  NodeList row=null;

  Element r;

  public void transform(TransformationInput arg0, TransformationOutput arg1)

  throws StreamTransformationException {

  // TODO Auto-generated method stub

  try { 

   execute(arg0.getInputPayload().getInputStream(),arg1.getOutputPayload().getOutputStream()); 

  } catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

  

    void sortandCreateNode(NodeList a,Element grandParent) throws  StreamTransformationException

    {

    try

    {

      Element arr[]=new Element[a.getLength()];

      

     

      for (int i = 0; i < arr.length; i++)

         {

           arr[i]=(Element) a.item(i); 

         }

      for (int i = 0; i < arr.length - 1; i++)

         {

             int index = i;

             for (int j = i + 1; j < arr.length; j++)

             {

                 if (arr[j].getElementsByTagName("Seller_ID").item(0).getTextContent().compareTo(arr[index].getElementsByTagName("Seller_ID").item(0).getTextContent())<0)

                     index = j;

             }   

             String smallerNumber = arr[index].getElementsByTagName("Seller_ID").item(0).getTextContent();

             arr[index].getElementsByTagName("Seller_ID").item(0).setTextContent(arr[i].getElementsByTagName("Seller_ID").item(0).getTextContent());

             arr[i].getElementsByTagName("Seller_ID").item(0).setTextContent(smallerNumber);

         }

      Element newParent=null;

    

      for(int i=0;i<arr.length;++i)

      {

      Node parentNode=arr[i].getParentNode(); 

      

    

      if(i==0 || arr[i].getElementsByTagName("Seller_ID").item(0).getTextContent().compareToIgnoreCase(arr[i-1].getElementsByTagName("Seller_ID").item(0).getTextContent())!=0)

      {

      newParent=docOut.createElement(parentNode.getNodeName());

      NamedNodeMap attributes = parentNode.getAttributes(); 

      

          for (int a1 = 0; a1 < attributes.getLength(); a1++) { 

          Node theAttribute = attributes.item(a1); 

          System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue()); 

          newParent.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue()); 

          }

        

      }

      Node rowVal=docOut.importNode(arr[i], true);

      newParent.appendChild(rowVal);

      grandParent.appendChild(newParent);

    

      }

    }

    catch(Exception e)

        {

            System.out.print(e.getClass().getName());

            String error = "Probabbly missing  Seller_ID node value";

            if(e.getClass().getName().indexOf("NullPointerException")<0)

            {

            error="";

            }

            throw new StreamTransformationException(e.getMessage()+" error: "+e.getClass().getName()+" "+error);

        }

  

  return;

    }

  private void execute(InputStream in,

  OutputStream out) throws StreamTransformationException{

  // TODO Auto-generated method stub

  try

  {

  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.parse(in);

    docOut = docBuilder.newDocument();

    Node SourceRootNode=doc.getDocumentElement();

    Element targetRootNode=docOut.createElement(SourceRootNode.getNodeName());

    NamedNodeMap attributes = SourceRootNode.getAttributes(); 

    

    for (int a1 = 0; a1 < attributes.getLength(); a1++) { 

    Node theAttribute = attributes.item(a1); 

    System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue()); 

    targetRootNode.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue()); 

    }

    docOut.appendChild(targetRootNode);

  

    NodeList MT_Test=doc.getElementsByTagName("ns1:MT_Test");

  

    for(int k=0;k<MT_Test.getLength();++k)

    {

    Element temp1=(Element) MT_Test.item(k);

  

    Element grandParent=docOut.createElement(temp1.getParentNode().getNodeName());

        attributes = temp1.getParentNode().getAttributes(); 

        

        for (int a1 = 0; a1 < attributes.getLength(); a1++) { 

        Node theAttribute = attributes.item(a1); 

        System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue()); 

        grandParent.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue()); 

        }

        targetRootNode.appendChild(grandParent);

    row=temp1.getElementsByTagName("row");

    sortandCreateNode(row,grandParent);

  

    }

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(docOut);

    StreamResult result = new StreamResult(out);

    // Output to console for testing

    // StreamResult result = new StreamResult(System.out);

    transformer.transform(source, result);

          

     in.close();

     out.close();

     return ;

  }//try

  catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

}

input

--------


<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

  <row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

      

          <row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

     <row>

            <Seller_ID>4569</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

  <row>

            <Seller_ID>7777</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>7777</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

      

          <row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

     <row>

            <Seller_ID>7777</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

output

--------


<?xml version="1.0" encoding="UTF-8" standalone="no"?><ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"><ns0:Message1><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>1234</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row><row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4567</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row><row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4569</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test></ns0:Message1><ns0:Message1><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>1234</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4567</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4568</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row></ns1:MT_Test><ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>7777</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row><row>

            <Seller_ID>7777</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row><row>

            <Seller_ID>7777</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test></ns0:Message1></ns0:Messages>

Regards

Anupam

Former Member
0 Kudos

Great work done . This is working . Thank you

P.S : I am facing a similar issue where there is a small change from this one . Can I request you to have a look in this if possible ? Many thanks in advance .

Regards

Abhishek

Answers (2)

Answers (2)

anupam_ghosh2
Active Contributor
0 Kudos

Hi Abhishek,

                   Please try this code


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.AbstractTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

import com.sap.aii.mapping.api.TransformationInput;

import com.sap.aii.mapping.api.TransformationOutput;

public class RepeatNode extends AbstractTransformation{

  @Override

  public void transform(TransformationInput arg0, TransformationOutput arg1)

  throws StreamTransformationException {

  // TODO Auto-generated method stub

  try { 

   execute(arg0.getInputPayload().getInputStream(),arg1.getOutputPayload().getOutputStream()); 

  } catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

  private void execute(InputStream in,

  OutputStream out) throws StreamTransformationException{

  // TODO Auto-generated method stub

  try

  {

  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.parse(in);

    Document docOut = docBuilder.newDocument();

    Node SourceRootNode=doc.getDocumentElement();

    Element targetRootNode=(Element) docOut.importNode(SourceRootNode,true);

    docOut.appendChild(targetRootNode);

    NodeList row=targetRootNode.getElementsByTagName("row");

    for(int i=0; i<row.getLength()-1;++i)

    {

    Node parentNode=row.item(i).getParentNode();

    for(int j=i+1;j<row.getLength();++j)

    {

    Node pNode=row.item(j).getParentNode();

    if(pNode.equals(parentNode))

    {

    //both rows have same parent. Then remove row to next level

    Node grandParent=parentNode.getParentNode();

    Element newParent=docOut.createElement(parentNode.getNodeName());

    NamedNodeMap attributes = parentNode.getAttributes();

  

         for (int a = 0; a < attributes.getLength(); a++) {

           Node theAttribute = attributes.item(a);

           System.out.println(theAttribute.getNodeName() + "=" + theAttribute.getNodeValue());

           newParent.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue());

         }

    Node temp=parentNode.removeChild(row.item(j));

    newParent.appendChild(temp);

    grandParent.appendChild(newParent);

    --j;

    }

    }

    }

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(docOut);

    StreamResult result = new StreamResult(out);

    // Output to console for testing

    // StreamResult result = new StreamResult(System.out);

    transformer.transform(source, result);

          

     in.close();

     out.close();

     return ;

  }

  catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

}

for input

---------------


<?xml version="1.0" encoding="UTF-8"?>

-<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

-<ns0:Message1>

-<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

-<row>

<SKU>SKU</SKU>

<Slave_Code>Slave_Code</Slave_Code>

<Quantity>Quantity</Quantity>

</row>

-<row>

<Seller_ID/>

<SKU/>

<Slave_Code/>

<Quantity/>

</row>

-<row>

<SKU>SKU1</SKU>

<Slave_Code>Slave_Code1</Slave_Code>

<Quantity>Quantity1</Quantity>

</row>

</ns1:MT_Test>

</ns0:Message1>

-<ns0:Message1>

-<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

-<row>

<SKU>SKU</SKU>

<Slave_Code>Slave_Code</Slave_Code>

<Quantity>Quantity</Quantity>

</row>

-<row>

<Seller_ID/>

<SKU/>

<Slave_Code/>

<Quantity/>

</row>

-<row>

<SKU>SKU1</SKU>

<Slave_Code>Slave_Code1</Slave_Code>

<Quantity>Quantity1</Quantity>

</row>

</ns1:MT_Test>

</ns0:Message1>

</ns0:Messages>

output

-----------


<?xml version="1.0" encoding="UTF-8" standalone="no"?><ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

        

        

      </ns1:MT_Test>

   <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID/>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code1</Slave_Code>

            <Quantity>Quantity1</Quantity>

         </row></ns1:MT_Test></ns0:Message1>

<ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

        

        

      </ns1:MT_Test>

   <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID/>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code1</Slave_Code>

            <Quantity>Quantity1</Quantity>

         </row></ns1:MT_Test></ns0:Message1>

</ns0:Messages>

Regards

Anupam

Former Member
0 Kudos

Looks good Anupam . Now what I actually need is this to work only when <Seller ID> tag (say) has different values in the next node. If all the Seller_ID nodes have same values in all nodes,then the XML output should remain same as the input.

Thanks in Advance !

Input with different Seller ID node values.

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

      </ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

anupam_ghosh2
Active Contributor
0 Kudos

Glad to know that you found my answer helpful.

Please try this code


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.AbstractTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

import com.sap.aii.mapping.api.TransformationInput;

import com.sap.aii.mapping.api.TransformationOutput;

public class RepeatNode extends AbstractTransformation{

  NodeList row=null;

  public void transform(TransformationInput arg0, TransformationOutput arg1)

  throws StreamTransformationException {

  // TODO Auto-generated method stub

  try { 

   execute(arg0.getInputPayload().getInputStream(),arg1.getOutputPayload().getOutputStream()); 

  } catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

    boolean checkNodes() throws StreamTransformationException

    {

    try

    {

  Element node=(Element) row.item(0);

  for(int j=1;j<row.getLength();++j)

  {

  Element temp=(Element) row.item(j);

  if(node.getElementsByTagName("Seller_ID").item(0).getTextContent().equals(temp.getElementsByTagName("Seller_ID").item(0).getTextContent()))

  {

  continue;

  }

  else

  {

  return true;

  }

  }

    }

    catch(NullPointerException e)

    {

    e.printStackTrace();

    throw new StreamTransformationException(e.getMessage()+" row has null values for mandatory Seller_id");

  

    }

    return false;

    }

  private void execute(InputStream in,

  OutputStream out) throws StreamTransformationException{

  // TODO Auto-generated method stub

  try

  {

  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.parse(in);

    Document docOut = docBuilder.newDocument();

    Node SourceRootNode=doc.getDocumentElement();

    Element targetRootNode=(Element) docOut.importNode(SourceRootNode,true);

    docOut.appendChild(targetRootNode);

    NodeList MT_Test=docOut.getElementsByTagName("ns1:MT_Test");

  

    for(int k=0;k<MT_Test.getLength();++k)

    {

    Element temp1=(Element) MT_Test.item(k);

  

    row=temp1.getElementsByTagName("row");

  

  

    boolean res=checkNodes();

  

                if(!res)

                {

                continue;

                }

    for(int i=0; i<row.getLength()-1;++i)

    {

    Node parentNode=row.item(i).getParentNode();

    for(int j=i+1;j<row.getLength();++j)

    {

    Node pNode=row.item(j).getParentNode();

    if(pNode.equals(parentNode))

    {

  

  

    //both rows have same parent. Then remove row to next level

    Node grandParent=parentNode.getParentNode();

      Element newParent=docOut.createElement(parentNode.getNodeName());

      NamedNodeMap attributes = parentNode.getAttributes();

    

           for (int a = 0; a < attributes.getLength(); a++)

           {

             Node theAttribute = attributes.item(a);

    

             newParent.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue());

           }

      Node temp=parentNode.removeChild(row.item(j));

      newParent.appendChild(temp);

      grandParent.appendChild(newParent);

      --j;

    }

    }

    }//inner for

    }//outer for

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(docOut);

    StreamResult result = new StreamResult(out);

    // Output to console for testing

    // StreamResult result = new StreamResult(System.out);

    transformer.transform(source, result);

          

     in.close();

     out.close();

     return ;

  }

  catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

}

input xml

----------------


<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

     </ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

<row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

  

   </ns0:Message1>

</ns0:Messages>

the output

----------------


<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

     </ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

  

   <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST"><row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row></ns1:MT_Test></ns0:Message1>

</ns0:Messages>

Regards

Anupam

Former Member
0 Kudos

Hi ,

The output is not as expected this time . Basically the <MT_Test> tag should end and start again only when there is a new Seller ID . Sample example what I am looking for is :

Input :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

<row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

----------------------------------------------

Expected Output :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

</ns1:MT_Test>

  <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

<row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

anupam_ghosh2
Active Contributor
0 Kudos

Please try this code. If you had explained your requirement properly with example earlier then I could have resolved the issue in my very first response.


import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.dom.DOMSource;

import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NamedNodeMap;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import com.sap.aii.mapping.api.AbstractTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

import com.sap.aii.mapping.api.TransformationInput;

import com.sap.aii.mapping.api.TransformationOutput;

public class RepeatNode extends AbstractTransformation{

  NodeList row=null;

  public void transform(TransformationInput arg0, TransformationOutput arg1)

  throws StreamTransformationException {

  // TODO Auto-generated method stub

  try { 

   execute(arg0.getInputPayload().getInputStream(),arg1.getOutputPayload().getOutputStream()); 

  } catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

    boolean checkNodes() throws StreamTransformationException

    {

    try

    {

  Element node=(Element) row.item(0);

  for(int j=1;j<row.getLength();++j)

  {

  Element temp=(Element) row.item(j);

  if(node.getElementsByTagName("Seller_ID").item(0).getTextContent().equals(temp.getElementsByTagName("Seller_ID").item(0).getTextContent()))

  {

  continue;

  }

  else

  {

  return true;

  }

  }

    }

    catch(NullPointerException e)

    {

    e.printStackTrace();

    throw new StreamTransformationException(e.getMessage()+" row has null values for mandatory Seller_id");

  

    }

    return false;

    }

  private void execute(InputStream in,

  OutputStream out) throws StreamTransformationException{

  // TODO Auto-generated method stub

  try

  {

  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

    Document doc = docBuilder.parse(in);

    Document docOut = docBuilder.newDocument();

    Node SourceRootNode=doc.getDocumentElement();

    Element targetRootNode=(Element) docOut.importNode(SourceRootNode,true);

    docOut.appendChild(targetRootNode);

    NodeList MT_Test=docOut.getElementsByTagName("ns1:MT_Test");

  

    for(int k=0;k<MT_Test.getLength();++k)

    {

    Element temp1=(Element) MT_Test.item(k);

  

    row=temp1.getElementsByTagName("row");

  

  

    boolean res=checkNodes();

  

                if(!res)

                {

                continue;

                }

    for(int i=0; i<row.getLength()-1;++i)

    {

    Node parentNode=row.item(i).getParentNode();

    Element e=(Element) row.item(i);

    for(int j=i+1;j<row.getLength();++j)

    {

    Node pNode=row.item(j).getParentNode();

    Element t=(Element) row.item(j);

    if(pNode.equals(parentNode))

    {

  

    if(e.getElementsByTagName("Seller_ID").item(0).getTextContent().equals(t.getElementsByTagName("Seller_ID").item(0).getTextContent()))

    {

    continue;

    }

  

    //both rows have same parent. Then remove row to next level

    Node grandParent=parentNode.getParentNode();

      Element newParent=docOut.createElement(parentNode.getNodeName());

      NamedNodeMap attributes = parentNode.getAttributes();

    

           for (int a = 0; a < attributes.getLength(); a++)

           {

             Node theAttribute = attributes.item(a);

    

             newParent.setAttribute(theAttribute.getNodeName(), theAttribute.getNodeValue());

           }

      Node temp=parentNode.removeChild(row.item(j));

      newParent.appendChild(temp);

      grandParent.appendChild(newParent);

      --j;

    }

    }

    }//inner for

    }//outer for

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    Transformer transformer = transformerFactory.newTransformer();

    DOMSource source = new DOMSource(docOut);

    StreamResult result = new StreamResult(out);

    // Output to console for testing

    // StreamResult result = new StreamResult(System.out);

    transformer.transform(source, result);

          

     in.close();

     out.close();

     return ;

  }

  catch (Exception e) { 

   e.printStackTrace(); 

   throw new StreamTransformationException(e.getMessage()); 

   // TODO Auto-generated catch block 

  } 

  }

 

}

Regards

Anupam

Former Member
0 Kudos

Firstly sorry for the inconvenience at the outset . I actually have separate requirements .

This is working just fine . So thank you for the prompt responses .

I have one more similar requirement which I want to close in the same post . The input is the same , but there is small addition in the Output where a new tag <Name> needs to be added having the value in <Seller_ID>. Can you please help on the same ?

Input :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

<row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

---------------------------------

Expected Output:

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

       <Name>1234</Name>   

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

</ns1:MT_Test>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name>4567</Name>   

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

<ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name>4568</Name>

<row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

Former Member
0 Kudos

Hi Anupam ,

Its partly correct . As soon as a new <row> node is added in the input , its not working as expected .

Please find the below issue . I have added another <row> with same Seller_ID ( say 4568 ) , but its adding a new <MT_Test> tag for it , although it has same value as the previous node .

Below is the input with added <row> tag .

Input :

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

   <ns0:Message1>

      <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU</SKU>

            <Slave_Code>Slave_Code</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>1234</Seller_ID>

            <SKU>SKU1</SKU>

            <Slave_Code>Slave_Code2</Slave_Code>

            <Quantity>Quantity</Quantity>

         </row>

         <row>

            <Seller_ID>4567</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

          <row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

          <row>

            <Seller_ID>4568</Seller_ID>

            <SKU/>

            <Slave_Code/>

            <Quantity/>

         </row>

</ns1:MT_Test>

   </ns0:Message1>

</ns0:Messages>

former_member190293
Active Contributor
0 Kudos

Hi Abhishek!

Just in case:

XSL transformation:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                       xmlns:xs="http://www.w3.org/2001/XMLSchema"

                       exclude-result-prefixes="xs"

                       version="1.0">

  

     <xsl:template match="/">

          <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

               <ns0:Message1>

                    <xsl:apply-templates select="//row[not(Seller_ID/text() = preceding::Seller_ID/text())]"/>

               </ns0:Message1>

          </ns0:Messages>

     </xsl:template>

  

    <xsl:template match="row">

          <xsl:variable name="ID" select="Seller_ID"/>

          <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name> <xsl:value-of select="$ID"/></Name>

               <xsl:for-each select="//row[Seller_ID/text() = $ID]">

                    <xsl:copy-of select="."/>           

               </xsl:for-each>

          </ns1:MT_Test>

    </xsl:template>

  

</xsl:stylesheet>

Input:

<?xml version="1.0" encoding="UTF-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

    <ns0:Message1>

        <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

            <row>

                <Seller_ID>1234</Seller_ID>

                <SKU>SKU</SKU>

                <Slave_Code>Slave_Code</Slave_Code>

                <Quantity>Quantity</Quantity>

            </row>

            <row>

                <Seller_ID>1234</Seller_ID>

                <SKU>SKU1</SKU>

                <Slave_Code>Slave_Code2</Slave_Code>

                <Quantity>Quantity</Quantity>

            </row>

            <row>

                <Seller_ID>4567</Seller_ID>

                <SKU/>

                <Slave_Code/>

                <Quantity/>

            </row>

            <row>

                <Seller_ID>4568</Seller_ID>

                <SKU/>

                <Slave_Code/>

                <Quantity/>

            </row>

        </ns1:MT_Test>

    </ns0:Message1>

</ns0:Messages>

Output:

<?xml version="1.0" encoding="utf-8"?>

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">

     <ns0:Message1>

          <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name>1234</Name>

               <row>

                    <Seller_ID>1234</Seller_ID>

                    <SKU>SKU</SKU>

                    <Slave_Code>Slave_Code</Slave_Code>

                    <Quantity>Quantity</Quantity>

               </row>

               <row>

                    <Seller_ID>1234</Seller_ID>

                    <SKU>SKU1</SKU>

                    <Slave_Code>Slave_Code2</Slave_Code>

                    <Quantity>Quantity</Quantity>

               </row>

          </ns1:MT_Test>

          <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name>4567</Name>

               <row>

                    <Seller_ID>4567</Seller_ID>

                    <SKU/>

                    <Slave_Code/>

                    <Quantity/>

               </row>

          </ns1:MT_Test>

          <ns1:MT_Test xmlns:ns1="http://test.com/xi/TEST">

               <Name>4568</Name>

               <row>

                    <Seller_ID>4568</Seller_ID>

                    <SKU/>

                    <Slave_Code/>

                    <Quantity/>

               </row>

          </ns1:MT_Test>

     </ns0:Message1>

</ns0:Messages>

Regards, Evgeniy.

former_member190293
Active Contributor
0 Kudos

Hi Abhishek!

I think the best way in your case is spend some time for learning java Document Object Model basics: Documents, Elements and Nodes.

By the way: for your requirement there is no need to use java mapping. It can be done with graphical mapping or XSL transformation with less or even without coding.

Regards, Evgeniy.