on 08-13-2016 11:53 AM
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>
Thank you for marking my answer as correct answer but I expected a thank you note from you.
Anyways keep smiling. All the best.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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>
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
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>
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
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>
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>
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.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
90 | |
10 | |
10 | |
10 | |
7 | |
7 | |
6 | |
5 | |
4 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.