当前位置: 首页 > 知识库问答 >
问题:

如何使用 apache Camel 而不是 xml 记录列表将平面文件中的单个记录转换为一个 xml

厍兴腾
2023-03-14

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>

预期输出

文件一.xml

<?xml version='1.0' encoding='UTF-8'?>    
    <Test>
            <ALT_NUM>55158</ALT_NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>2346</UOMCOD>
    </Test>

文件二.xml

<?xml version='1.0' encoding='UTF-8'?>    
    <Test>
            <ALT_NUM>55158</ALT_NUM>
            <PRTNUM>11901</PRTNUM>
            <UOMCOD>3454</UOMCOD>
    </Test>

我能够在一个文件中生成包含所有字段的xml文件。我希望在单个xml文件中有单个记录。有人能帮我吗?还有输出文件根元素中的标签名,它是生成包类的名字。

共有1个答案

宦书
2023-03-14

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

from(SOURCE_INPUT_PATH).
 .split().tokenize(System.lineSeparator())
   unmarshal(bindyFixed).
   marshal().
   xstream().
   to(SOURCE_OUTPUT_PATH).log("Finished Transformation").end();
 类似资料:
  • 我目前正在从事一个项目,该项目需要利用存储在SQL db中的数据,其格式如下所示。 我需要做的,而且我很难找到一个工具来帮助,是获取这些数据,并创建一个多列的单一记录,该记录与ID和事件日期相分离。虽然我在网上找到了一些关于事件驱动处理程序的信息,但问题是,虽然我的标签上写着“event ”,但实际上存储的是被称为“Events”的单独的数据片段,这些数据片段实际上是单独的条目,它们经常(但不总是

  • ,日志记录将进入一个文件; (路径)/service_name/service_name.log 我想用logback复制这种行为,但在logback.xml配置中获取“logger”名称时遇到了真正的困难。它可以在log encoder.pattern中看到,即“%d%-5level%logger{35}-%msg%n”。

  • 我有一个“Customer”表,它有将近120万条记录,其中一列是ntext类型的“customer_records ”,它包含xml数据。我需要在该列的所有现有记录中替换一个url值。我尝试了下面的替换查询,但是执行该查询需要大约20分钟的时间。 在更新期间,CPU 消耗被利用到最大,这引起了问题。在 120 万条记录中,实际更新的记录中有 60 万条记录,但查询需要读取每条记录以查找和替换 U

  • 本文向大家介绍MongoDB将带有数组的记录转换为新集合中的多个记录,包括了MongoDB将带有数组的记录转换为新集合中的多个记录的使用技巧和注意事项,需要的朋友参考一下 为此,可以将$out与aggregate()和$undend一起使用。让我们用文档创建一个集合 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是将具有数组的一个记录转换为新集合中的多个记录的查询- 这

  • 在我的Oracle数据库中,我有存储为VARCHAR的数量值。从数据库中检索记录时,我希望将它们映射到一个POJO,其中金额值表示为double。不幸的是,我不能使用强制类型,因为在数据库中,所有内容都存储为VARCHAR,并且没有模式将列标识为包含金额值的列。 我正在查看jOOQ转换器,这似乎是我想要的。因此,我为此创建了一个jOOQ转换器: 然而,每当我想使用将数据库记录映射到我的POJO时,

  • 给定以下示例代码 不可能将变量传递给函数,因为 类型为“MyInterface”的参数不可分配给类型为“Record”的参数 我通过转换变量解决了这个问题

  • 给定:我在Kafka中有两个主题,假设主题A和主题B。Kafka流从主题A中读取一条记录,对其进行处理,并产生与所消耗记录相对应的多条记录(假设recordA和recordB)。现在的问题是我如何使用Kafka流来实现这一点。 在这里,读取的记录是消息;处理之后,它返回一个消息列表。如何将此列表划分为两个生产者流?任何帮助都将不胜感激。