EDI to XML Transformation
Here is the example to transform an EDI file in to XML file.
EDI file: Copy this file into C:/EDI/TEMP/Edi.txt
ISA|00| |00| |01|ABCDEFG123 |01|XYZ989898 |111101|0026|^|00405|8909878|0|P|~ GS|GP|ABCDEFG123|XYZ989898|20111101|00264275|5640890|X|004050 ST|600|0001 BIG|04||2396268533||00|20111024||||20111101||20111101 REF|AN|645645646|ORDERNO REF|11|7576456456|AN REF|BD|X|RT PER|GE|BA TISOC|TE|8006849012 DTM|097|20111101|0026 DTM|150|20111031 DTM|198|20111031 DTM|995|20111101 PID|X||TI|FEP|B N1|BT |ACME DEVELOPMENT COMPANY N3|PO BOX 6780 N4|BIG CITY|MI|98989 N1|VN |SHIPPING COMPANY N3|PO BOX 1111 N4|NY CITY|NY|11111 N9|ME|MLT MTX||This is info 1 N9|ME|MLT MTX||TThis is info 1 N9|ME|MLT MTX||This is info 1 CTT|0 SE|15|0001 GE|1|555555 IEA|1|6666666
smooks config file: Copy this file into C:/EDI/TEMP/SmooksConfig.xml
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd"> <resource-config selector="org.xml.sax.driver"> <resource>org.milyn.smooks.edi.SmooksEDIParser</resource> <param name="mapping-model">C://EDI//TEMP//Mapping.xml</param> </resource-config> </smooks-resource-list>
smooks mapping file: Copy this file into C:/EDI/TEMP/Mapping.xml
<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.4.xsd">
<medi:description name="xml" version="1.4" />
<medi:delimiters segment="
" field="|" component="*" sub-component="."/>
<medi:segments xmltag="ORDER">
<medi:segmentGroup xmltag="ENVELOP_HEADER" maxOccurs="-1">
<medi:field xmltag="SMOOKS1"/>
<medi:field xmltag="SMOOKS2"/>
<medi:field xmltag="SMOOKS3"/>
<medi:field xmltag="SMOOKS4"/>
<medi:field xmltag="SMOOKS5"/>
<medi:field xmltag="SMOOKS6"/>
<medi:field xmltag="SMOOKS7"/>
<medi:field xmltag="SMOOKS8"/>
<medi:field xmltag="SMOOKS9"/>
<medi:field xmltag="SMOOKS10"/>
<medi:field xmltag="SMOOKS11"/>
<medi:field xmltag="SMOOKS12"/>
<medi:field xmltag="SMOOKS13"/>
<medi:field xmltag="SMOOKS14"/>
<medi:field xmltag="SMOOKS15"/>
<medi:field xmltag="SMOOKS16"/>
<medi:field xmltag="SMOOKS17"/>
</medi:segment>
<medi:segment segcode="GS" xmltag="FUNCTIONALHEADER">
<medi:field xmltag="SMOOKS1"/>
<medi:field xmltag="SMOOKS2"/>
<medi:field xmltag="SMOOKS3"/>
<medi:field xmltag="SMOOKS4"/>
<medi:field xmltag="SMOOKS5"/>
<medi:field xmltag="SMOOKS6"/>
<medi:field xmltag="SMOOKS7"/>
<medi:field xmltag="SMOOKS8"/>
</medi:segment>
<medi:segment segcode="ST\|600.*" xmltag="DOCUMENT_INFORMATION_GRP" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="DOCUMENT_TYPE" />
<medi:field xmltag="DOCUMENT_NUM" />
</medi:segment>
</medi:segmentGroup>
<medi:segmentGroup xmltag="DOCUMENT_HEADER" maxOccurs="-1" minOccurs="0">
<medi:segment segcode="BIG\|04.*" xmltag="ORD_GRP" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
<medi:field xmltag="SMOOKS4" />
<medi:field xmltag="SMOOKS5" />
<medi:field xmltag="SMOOKS6" />
<medi:field xmltag="SMOOKS7" />
<medi:field xmltag="SMOOKS8" />
<medi:field xmltag="SMOOKS9" />
<medi:field xmltag="SMOOKS10" />
<medi:field xmltag="SMOOKS11" />
<medi:field xmltag="SMOOKS12" />
</medi:segment>
<medi:segment segcode="REF\|AN.*" xmltag="ORDER_INFO_GRP" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="SEGQUALIFIER" />
<medi:field xmltag="ORDER" />
<medi:field xmltag="TYPE" />
</medi:segment>
<medi:segment segcode="REF\|11.*" xmltag="ORDER_INFO_GRP2" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="SEGQUALIFIER" />
<medi:field xmltag="ACCOUNT_NUMBER" />
<medi:field xmltag="TYPE" />
</medi:segment>
<medi:segment segcode="REF\|BD.*" xmltag="ORDER_INFO_GRP3" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
</medi:segment>
<medi:segment segcode="PER\|GE.*" xmltag="ORDER_INFO_GRP4" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
<medi:field xmltag="SMOOKS4" />
</medi:segment>
<medi:segment segcode="DTM\|097.*" xmltag="ORDER_INFO_GRP5" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
</medi:segment>
<medi:segment segcode="DTM\|150.*" xmltag="ORDER_INFO_GRP6" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
<medi:field xmltag="SMOOKS4" />
<medi:field xmltag="SMOOKS5" />
<medi:field xmltag="SMOOKS6" />
<medi:field xmltag="SMOOKS7" />
</medi:segment>
<medi:segment segcode="DTM\|198.*" xmltag="ORDER_INFO_GRP7" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="DTM\|995.*" xmltag="ORDER_INFO_GRP8" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
<medi:field xmltag="SMOOKS4" />
</medi:segment>
<medi:segment segcode="PID" xmltag="ORDER_INFO_GRP9" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
<medi:field xmltag="SMOOKS4" />
<medi:field xmltag="SMOOKS5" />
</medi:segment>
<medi:segmentGroup xmltag="BILLING_ADDRESS_GROUP" maxOccurs="-1" minOccurs="0">
<medi:segment segcode="N1\|BT.*" xmltag="BILLING_ADDRESS1" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="N3" xmltag="BILLING_ADDRESS2" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="N4" xmltag="BILLING_ADDRESS3" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
</medi:segment>
</medi:segmentGroup>
<medi:segmentGroup xmltag="SHIPPING_ADDRESS_GROUP" maxOccurs="-1" minOccurs="0">
<medi:segment segcode="N1\|VN.*" xmltag="SHIPPING_ADDRESS1" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="N3" xmltag="SHIPPING_ADDRESS2" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="N4" xmltag="SHIPPING_ADDRESS3" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
<medi:field xmltag="SMOOKS3" />
</medi:segment>
</medi:segmentGroup>
<medi:segmentGroup xmltag="DOCUMENT_LINEITEMS" maxOccurs="-1" minOccurs="0">
<medi:segment segcode="N9" xmltag="LINE_ITEM" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
<medi:segment segcode="MTX" xmltag="LINE_INFO" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="SMOOKS1" />
<medi:field xmltag="SMOOKS2" />
</medi:segment>
</medi:segmentGroup>
</medi:segmentGroup>
<medi:segmentGroup xmltag="DOCUMENT_SUMMARY" maxOccurs="1" minOccurs="0">
<medi:segment segcode="CTT" xmltag="CTT" maxOccurs="1" minOccurs="0" truncatable="true">
<medi:field xmltag="CTT" />
</medi:segment>
</medi:segmentGroup>
<medi:segmentGroup xmltag="ENVELOP_FOOTER" maxOccurs="1">
<medi:segment segcode="SE" xmltag="SEGMENTDETAILS" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="SEGQUALIFIER" />
<medi:field xmltag="TYPE" />
</medi:segment>
<medi:segment segcode="GE" xmltag="GE" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="TRANSACTIONSETCOUNT" />
<medi:field xmltag="GROUPCONTROLNUMBER" />
</medi:segment>
<medi:segment segcode="IEA" xmltag="IEA" maxOccurs="-1" minOccurs="0" truncatable="true">
<medi:field xmltag="FUNCGROUPCOUNT" />
<medi:field xmltag="INTERCHANGECONTROLNUMBER" />
</medi:segment>
</medi:segmentGroup>
</medi:segments>
</medi:edimap>
Java class to execute transformation: Once you execute following class it will generate Edi.xml file in in C:/EDI/TEMP You need to have commons-lang-2.6jar, commons-loggong.jar, jaxen-1.1.2.jar,jdom-1.0.jar,milyn-commons-1.4.jar, milyn-edisax-parser-1.4.jar. milyn-smooks-core.jar, milyn-smooks-edi-1.2.jar, milyn-smooks-javabean-1.2.4.jar, milyn-smooks-templating-1.2.4.jar, mvel2-2.1.jar files in class path.
package com.tech.sample.smooks;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.Writer;
import java.util.Scanner;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.milyn.Smooks;
public class Sample {
public static void main(String[] args){
String ediContentStr = null;
String xmlFileName = "C://EDI//TEMP//Edi.xml";
try{
Smooks smooks = new Smooks("C://EDI//TEMP//SmooksConfig.xml");
ediContentStr = getFileContent("C://EDI//TEMP//Edi");
System.out.println("Edi Con" + ediContentStr);
String xmlStr = null;
ByteArrayOutputStream xmlstream = new ByteArrayOutputStream();
StringReader reader = new StringReader(ediContentStr);
smooks.filterSource(new StreamSource(reader), new StreamResult(xmlstream));
xmlStr = xmlstream.toString();
writeToXMLFile(xmlStr, xmlFileName);
} catch(Exception e){
e.printStackTrace();
}
}
private static boolean writeToXMLFile(String content, String fileName) {
boolean success = false;
try{
File xmlfile = new File(fileName);
xmlfile.createNewFile();
setContentsToFile(xmlfile, content);
success = true;
}catch(Exception e){
e.printStackTrace();
success = false;
}
return success;
}
private static void setContentsToFile(File aFile, String aContents) throws FileNotFoundException, IOException {
if (aFile == null) {
throw new IllegalArgumentException("File should not be null.");
}
if (!aFile.exists()) {
throw new FileNotFoundException ("File does not exist: " + aFile);
}
if (!aFile.isFile()) {
throw new IllegalArgumentException("Should not be a directory: " + aFile);
}
if (!aFile.canWrite()) {
throw new IllegalArgumentException("File cannot be written: " + aFile);
}
Writer output = new BufferedWriter(new FileWriter(aFile));
try {
output.write( aContents );
}
finally {
output.close();
}
}
private static String getFileContent(String fileName){
Scanner scanner = null;
StringBuilder fileContents = null;
try{
File file = new File(fileName);
fileContents = new StringBuilder((int)file.length());
scanner = new Scanner(file);
String lineSeparator = System.getProperty("line.separator");
while(scanner.hasNextLine()) {
fileContents.append(scanner.nextLine() + lineSeparator);
}
}catch(Exception e){
e.printStackTrace();
}
finally {
if(scanner != null){
scanner.close();
}
}
return fileContents.toString();
}
}