简体   繁体   中英

How to transform individual record in flat file to one xml using apache camel instead of list of xml records

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM