CamelConfig.java
@Component
public class CamelConfig extends RouteBuilder {
@Override
public void configure() throws Exception {
try {
CamelContext context = new DefaultCamelContext();
ConverterRoute route = new ConverterRoute();
route.addRoutesToCamelContext(context);
context.start();
Thread.sleep(5000);
context.stop();
} catch (Exception exe) {
exe.printStackTrace();
}
}
}
ConverterRoute.java
public class ConverterRoute implements RoutesBuilder {
private static final String SOURCE_INPUT_PATH = "file://inbox?fileName=Source.txt";
private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.xml";
public void addRoutesToCamelContext(CamelContext context) throws Exception {
context.addRoutes(new RouteBuilder() {
public void configure() {
try {
DataFormat bindyFixed = new BindyCsvDataFormat(Test.class);
from(SOURCE_INPUT_PATH).
unmarshal(bindyFixed).
marshal().
xstream().
to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Source.txt
55158|11901|2346
55158|11101|3454
Test.java
@CsvRecord(separator = "\\|",skipField = true,name = "Test")
public class Test {
@DataField(pos = 1,name = "ALT_NUM")
private BigDecimal ALT_NUM;
@DataField(pos = 2,name = "PRTNUM")
private BigDecimal PRTNUM;
@DataField(pos = 3,name = "UOMCOD")
private Integer UOMCOD;
}
OUTPUT
* File.xml*
<?xml version='1.0' encoding='UTF-8'?>
<list>
<com.john.Test>
<ALT_NUM>55158</ALT_NUM>
<PRTNUM>11901</PRTNUM>
<UOMCOD>2346</UOMCOD>
</com.john.Test>
<com.john.Test>
<TRNNAM>55158</TRNNAM>
<PRTNUM>11901</PRTNUM>
<UOMCOD>3454</UOMCOD>
</com.john.Test>
</list>
Expected Output
fileOne.xml
<?xml version='1.0' encoding='UTF-8'?>
<Test>
<ALT_NUM>55158</ALT_NUM>
<PRTNUM>11901</PRTNUM>
<UOMCOD>2346</UOMCOD>
</Test>
fileTwo.xml
<?xml version='1.0' encoding='UTF-8'?>
<Test>
<ALT_NUM>55158</ALT_NUM>
<PRTNUM>11901</PRTNUM>
<UOMCOD>3454</UOMCOD>
</Test>
I was able to generate xml file with all the fields in single file.I want single record in single xml file. Can anyone help me.Also the tag names in the output file root element it is generating the package name of the class.
You can probably use split()
to process each line from the csv record separately.
from(SOURCE_INPUT_PATH).
.split().tokenize(System.lineSeparator())
unmarshal(bindyFixed).
marshal().
xstream().
to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();