Как преобразовать отдельную запись в плоском файле в один xml, используя верблюд apache вместо списка записей xml

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

Источник.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-файле. Может ли кто-нибудь помочь мне. Кроме того, имена тегов в корневом элементе выходного файла создают имя пакета класса.


person TechGeek    schedule 02.10.2019    source источник


Ответы (1)


Вероятно, вы можете использовать split() для обработки каждой строки из записи csv отдельно.

from(SOURCE_INPUT_PATH).
 .split().tokenize(System.lineSeparator())
   unmarshal(bindyFixed).
   marshal().
   xstream().
   to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
person Camel Dev    schedule 02.10.2019
comment
Я вижу, что сплит-изменения работают. Но как я могу дать уникальные имена файлам для отдельных файлов xml. Спасибо, Арун. - person TechGeek; 02.10.2019
comment
Попробуйте заменить SOURCE_OUTPUT_PATH, как показано ниже. Это решит проблемы с уникальными именами файлов вплоть до секунд, но если 2 файла создаются в одну и ту же секунду, вам, возможно, придется создать что-то на микросекундном уровне private static final String SOURCE_OUTPUT_PATH = "file://outbox?fileName=file.xml_$simple{date:now:yyyyMMddHHmmss}"; - person Camel Dev; 02.10.2019
comment
нет, это не сработало. Тем не менее он генерирует один файл. с данными одной записи. - person TechGeek; 02.10.2019
comment
Привет! Это сработало, когда я заменил эту отметку времени на микросекунду. Могу ли я узнать, как изменить имя тега. Он генерировался вместе с именем пакета (например: com.john.test, мне нужно просто проверить, а не печатать полное имя пакета pojo. - person TechGeek; 02.10.2019