V1.2:edi-to-xml

From Smooks

Jump to: navigation, search

This tutorial illustrates is how to generate a stream of SAX events from an EDI stream and how that stream of SAX events feeds into Smooks to generate an XML model that can be transformed further (in this case it is not).

Contents

Executing the example is quite simple. From the example root folder, execute:

  1. "mvn clean install"
  2. "mvn exec:java"

Example source can be viewed and/or checked out from SVN here.


References:


(Back to Examples Index Page...)

Transforming from EDI to XML

This example illustrates how to hook the EdiSax EDI parser into a Smooks based transform (filter operation). It's another example of how non-XML streams can be processed by Smooks (see the csv-to-xml  example).

In this example, we simply configure in the EdiSax parser to process the EDI stream into XML. We don't perform any other transforms on the underlying data. For an example of how other transform operations can be built on top of this edi-to-xml transform, see the edi-to-java  example.

So here's the source edi file that is to be transformed:

HDR*1*0*59.97*64.92*4.95*Wed Nov 15 13:45:28 EST 2006
CUS*user1*Harry^Fletcher*SD
ORD*1*1*364*The 40-Year-Old Virgin*29.98
ORD*2*1*299*Pulp Fiction*29.99

And this is the expected result of our transformation:

<Order>
<header>
<order-id>1</order-id>
<status-code>0</status-code>
<net-amount>59.97</net-amount>
<total-amount>64.92</total-amount>
<tax>4.95</tax>
<date>Wed Nov 15 13:45:28 EST 2006</date>
</header>
<customer-details>
<username>user1</username>
<name>
<firstname>Harry</firstname>
<lastname>Fletcher</lastname>
</name>
<state>SD</state>
</customer-details>
<order-item>
<position>1</position>
<quantity>1</quantity>
<product-id>364</product-id>
<title>The 40-Year-Old Virgin</title>
<price>29.98</price>
</order-item>
<order-item>
<position>2</position>
<quantity>1</quantity>
<product-id>299</product-id>
<title>Pulp Fiction</title>
<price>29.99</price>
</order-item>
</Order>

The Smooks Configuration

We simply specify the SmooksEDIParser  as the stream parser. More transformation configurations could be added to transform this message further.

Here's the configuration ("smooks-config.xml"):

<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:edi="http://www.milyn.org/xsd/smooks/edi-1.1.xsd">
 
<!--
Configure the EDI Reader to process the message stream into a stream of SAX events.
-->
<edi:reader mappingModel="/example/edi-to-xml-order-mapping.xml" />
 
</smooks-resource-list>

Here's the edi mapping ("/src/main/java/example/edi-to-xml-order-mapping.xml"):

<?xml version="1.0" encoding="UTF-8"?>
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.0.xsd">
 
<medi:description name="DVD Order" version="1.0" />
 
<medi:delimiters segment="&#10;" field="*" component="^" sub-component="~" />
 
<medi:segments xmltag="Order">
 
<medi:segment segcode="HDR" xmltag="header">
<medi:field xmltag="order-id" />
<medi:field xmltag="status-code" />
<medi:field xmltag="net-amount" />
<medi:field xmltag="total-amount" />
<medi:field xmltag="tax" />
<medi:field xmltag="date" />
</medi:segment>
 
<medi:segment segcode="CUS" xmltag="customer-details">
<medi:field xmltag="username" />
<medi:field xmltag="name">
<medi:component xmltag="firstname" />
<medi:component xmltag="lastname" />
</medi:field>
<medi:field xmltag="state" />
</medi:segment>
 
<medi:segment segcode="ORD" xmltag="order-item" maxOccurs="-1">
<medi:field xmltag="position" />
<medi:field xmltag="quantity" />
<medi:field xmltag="product-id" />
<medi:field xmltag="title" />
<medi:field xmltag="price" />
</medi:segment>
 
</medi:segments>
 
</medi:edimap>

The following illustrations attempts to visually describe the mapping that takes place (see EDIParser):

Image:Edi-mapping.png

Executing The Transformation

Again, it's exactly the same as with the java-basic  tutorial:

// Instantiate Smooks with the config...
Smooks smooks = new Smooks("smooks-config.xml");
 
try {
// Filter the input message to the outputWriter...
smooks.filterSource(new StreamSource(messageIn), new StreamResult(messageOut));
} finally {
smooks.close();
}

Of course, you'd typically cache the Smooks  instance.

See the example/Main.java  in the example source.