【问题标题】:How to transform individual record in flat file to one xml using apache camel instead of list of xml records如何使用 apache camel 而不是 xml 记录列表将平面文件中的单个记录转换为一个 xml
【发布时间】:2019-10-02 15:25:06
【问题描述】:

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;

}

输出

* 文件.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>

预期输出

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>

我能够生成包含单个文件中所有字段的 xml 文件。我想要单个 xml 文件中的单个记录。任何人都可以帮助我。还有输出文件根元素中的标记名称,它正在生成类的包名称。

【问题讨论】:

    标签: java apache-camel spring-camel bindy


    【解决方案1】:

    您可能可以使用split() 分别处理来自 csv 记录的每一行。

    from(SOURCE_INPUT_PATH).
     .split().tokenize(System.lineSeparator())
       unmarshal(bindyFixed).
       marshal().
       xstream().
       to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
    

    【讨论】:

    • 我可以看到拆分更改工作。但是我怎样才能为单个 xml 文件提供唯一的文件名。谢谢阿伦
    • 尝试如下替换 SOURCE_OUTPUT_PATH。这将在几秒钟内解决唯一文件名问题,但如果在同一秒内创建了 2 个文件,那么您可能需要在微秒级别创建一些东西 private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.xml_$simple{date:now:yyyyMMddHHmmss}";
    • 不,它没有用。它仍然在生成单个文件。单条记录数据。
    • 嘿!当我用微秒替换那个时间戳时它起作用了。我可以知道如何更改标签名称。它与包名一起生成(例如:com.john.test,我只需要测试而不是打印整个 pojo 包名。
    猜你喜欢
    • 2012-09-08
    • 2019-09-21
    • 2019-09-13
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多