Recent project required make call to Concur REST API using PI REST adapter, get REST XML response, then do further processing. The REST XML response do not conform with message type/external definition defined, cause problem not able to process further
JAVA Mapping Simple FirstName LastName to FullName using SAX
In this example, demonstrated Java mapping to concatenate first name and last name to full name using SAX. Source XML:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <ns0:MT_FIRSTNAME_LASTNAME xmlns:ns0="http://test.com/common"> <row> <FirstName>Yun Fat</FirstName> <LastName>Chow</LastName> </row> <row> <FirstName>Michael</FirstName> <LastName>Jackson</LastName> </row> </ns0:MT_FIRSTNAME_LASTNAME> |
Target XML:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <MT_FULLNAME> <row> <FullName>Yun Fat Chow</FullName> </row> <row> <FullName>Michael Jackson</FullName> </row> </MT_FULLNAME> |
Java mapping class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package com.map; import java.io.*; import javax.xml.parsers.*; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.sap.aii.mapping.api.*; public class Test_JavaMapping_FirstNameLastName2FullName_SAX extends AbstractTransformation { public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); FullNameHandler handler = new FullNameHandler(); parser.parse(inputstream, handler); String outputString = handler.getOutputString(); outputstream.write(outputString.getBytes()); } catch (Exception exception) { throw new StreamTransformationException(exception.toString()); } } } class FullNameHandler extends DefaultHandler { String sContent = ""; String sName = ""; String sTemp = ""; StringBuffer fresult = new StringBuffer(); String sFirstName = ""; String sLastName = ""; public String getOutputString(){ return fresult.toString(); } public void startDocument() throws SAXException { fresult.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); fresult.append("<MT_FULLNAME>"); } public void endDocument() throws SAXException { fresult.append("</MT_FULLNAME>"); } public void startElement(String uri, String localName, String name, Attributes attributes)throws SAXException{ sContent = ""; sName = name; if("row".equalsIgnoreCase(name)){ sFirstName = ""; sLastName = ""; } } public void endElement(String uri, String localName, String name) throws SAXException{ if("FirstName".equalsIgnoreCase(name)){ sFirstName = sContent; } if("LastName".equalsIgnoreCase(name)){ sLastName = sContent; } if("row".equalsIgnoreCase(name)){ fresult.append("<row>"); fresult.append("<FullName>"); fresult.append(sFirstName + " " + sLastName); fresult.append("</FullName>"); fresult.append("</row>"); } } public void characters(char[] ch, int start, int length)throws SAXException{ sContent = new String(ch, start, length); } } |
JAVA Mapping Simple FirstName LastName to FullName using DOM
In this example, demonstrated Java mapping to concatenate first name and last name to full name using DOM. Source XML:
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="UTF-8"?> <ns0:MT_FIRSTNAME_LASTNAME xmlns:ns0="http://test.com/common"> <row> <FirstName>Yun Fat</FirstName> <LastName>Chow</LastName> </row> <row> <FirstName>Michael</FirstName> <LastName>Jackson</LastName> </row> </ns0:MT_FIRSTNAME_LASTNAME> |
Target XML:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0" encoding="UTF-8"?> <MT_FULLNAME> <row> <FullName>Yun Fat Chow</FullName> </row> <row> <FullName>Michael Jackson</FullName> </row> </MT_FULLNAME> |
JAVA mapping class:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.map; import java.io.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import com.sap.aii.mapping.api.*; public class Test_JavaMapping_FirstNameLastName2FullName_DOM extends AbstractTransformation { public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException { try { InputStream inputstream = transformationInput.getInputPayload().getInputStream(); OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream(); DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document inDoc = docBuilder.parse(inputstream); Document outDoc = docBuilder.newDocument(); Element oMT = outDoc.createElement("MT_FULLNAME"); outDoc.appendChild(oMT); NodeList nodes = inDoc.getElementsByTagName("row"); for (int i = 0; i < nodes.getLength(); i++){ Element oRow = outDoc.createElement("row"); oMT.appendChild(oRow); Node node = nodes.item(i); if (node.getNodeType() == Node.ELEMENT_NODE){ Element element = (Element)node; String sFirstName = element.getElementsByTagName("FirstName").item(0).getTextContent(); String sLastName = element.getElementsByTagName("LastName").item(0).getTextContent(); String sFullName = sFirstName + " " + sLastName; Element oFullName = outDoc.createElement("FullName"); oFullName.appendChild(outDoc.createTextNode(sFullName)); oRow.appendChild(oFullName); } } Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.transform(new DOMSource(outDoc), new StreamResult(outputstream)); } catch (Exception exception) { throw new StreamTransformationException(exception.toString()); } } } |
JAVA Mapping One-to-One Source-to-Target using DOM
To get started to develop JAVA mapping in SAP NWDS, go to this excellent post by Raghu Below PI java mapping parse source xml file into DOM, then output the same DOM to target xml. Very basic just to show