Apache camel 使用bindy将csv转换为xml
我有这样的想法:Apache camel 使用bindy将csv转换为xml,apache-camel,bindy,Apache Camel,Bindy,我有这样的想法: 31 name 2018-11-01 2018-10-31 12:05:16 3 1 10 1.00 13.00 14 2 20 1.00 14.00 14 3 30 1.00 15.00 14 public class Order { private int id; private String name; private String date1;
31 name 2018-11-01 2018-10-31 12:05:16 3
1 10 1.00 13.00 14
2 20 1.00 14.00 14
3 30 1.00 15.00 14
public class Order {
private int id;
private String name;
private String date1;
private int date2;
private char numerOfFile;
private List<OrderBody> orderBodyList;
}
public class OrderBody {
private int lp;
private int id;
private BigDecimal priceByOne;
private BigDecimal count;
private int foreignId;
}
一行中的字段由制表符分隔
接下来我还有另一行,分开的标签。每行用“\n”分隔
我的课程应该是什么样子
我是这样做的:
31 name 2018-11-01 2018-10-31 12:05:16 3
1 10 1.00 13.00 14
2 20 1.00 14.00 14
3 30 1.00 15.00 14
public class Order {
private int id;
private String name;
private String date1;
private int date2;
private char numerOfFile;
private List<OrderBody> orderBodyList;
}
public class OrderBody {
private int lp;
private int id;
private BigDecimal priceByOne;
private BigDecimal count;
private int foreignId;
}
公共类秩序{
私有int-id;
私有字符串名称;
私有字符串date1;
私家侦探2;
私人文件;
私有列表orderBodyList;
}
公共类OrderBody{
私人有限公司;
私有int-id;
私人大十进制价格比一;
私有大十进制计数;
外来的私人智力;
}
我建议使用Groovy DSL和MarkupBuilder
这实际上可以通过camel bindy使用FixedLengthRecord模型,并以tab作为分隔符来实现。模型中的最后一个字段似乎需要长度,但其他字段可以使用tab作为分隔符 下面是一个示例代码: 订单头:
import java.util.Date;
import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;
@FixedLengthRecord()
public class OrderHeader {
@DataField(pos = 1, delimiter = "\t")
private int id;
@DataField(pos = 2, delimiter = "\t")
private String name;
@DataField(pos = 3, delimiter = "\t", pattern = "yyyy-MM-dd")
private Date date1;
@DataField(pos = 4, delimiter = "\t", pattern = "yyyy-MM-dd hh:mm:ss")
private Date date2;
@DataField(pos = 5, length = 1)
private int numerOfFile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate1() {
return date1;
}
public void setDate1(Date date1) {
this.date1 = date1;
}
public Date getDate2() {
return date2;
}
public void setDate2(Date date2) {
this.date2 = date2;
}
public int getNumerOfFile() {
return numerOfFile;
}
public void setNumerOfFile(int numerOfFile) {
this.numerOfFile = numerOfFile;
}
}
订单:
import java.math.BigDecimal;
import org.apache.camel.dataformat.bindy.annotation.DataField;
import org.apache.camel.dataformat.bindy.annotation.FixedLengthRecord;
@FixedLengthRecord(header = OrderHeader.class)
public class Order {
@DataField(pos = 1, delimiter = "\t")
private int lp;
@DataField(pos = 2, delimiter = "\t")
private int id;
@DataField(pos = 3, delimiter = "\t")
private BigDecimal priceByOne;
@DataField(pos = 4, delimiter = "\t")
private BigDecimal count;
@DataField(pos = 5, length = 2)
private int foreignId;
public int getLp() {
return lp;
}
public void setLp(int lp) {
this.lp = lp;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public BigDecimal getPriceByOne() {
return priceByOne;
}
public void setPriceByOne(BigDecimal priceByOne) {
this.priceByOne = priceByOne;
}
public BigDecimal getCount() {
return count;
}
public void setCount(BigDecimal count) {
this.count = count;
}
public int getForeignId() {
return foreignId;
}
public void setForeignId(int foreignId) {
this.foreignId = foreignId;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
str.append("...lp:").append(lp).append("\n");
str.append("...id:").append(id).append("\n");
str.append("...priceByOne:").append(priceByOne).append("\n");
str.append("...count:").append(count).append("\n");
str.append("...foreignId:").append(foreignId).append("\n");
return str.toString();
}
XmlOrder:
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class XmlOrder extends OrderHeader {
public XmlOrder() {
}
private List<Order> line;
public XmlOrder(OrderHeader header, List<Order> lines) {
this.setDate1(header.getDate1());
this.setDate2(header.getDate2());
this.setId(header.getId());
this.setName(header.getName());
this.setNumerOfFile(header.getNumerOfFile());
this.setLines(lines);
}
public List<Order> getLines() {
return line;
}
public void setLines(List<Order> lines) {
this.line = lines;
}
}
订单处理程序:
import java.util.List;
import java.util.Map;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.dataformat.bindy.fixed.BindyFixedLengthDataFormat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.stefan.test.fixedlengthtest.model.OrderHeader;
import com.stefan.test.fixedlengthtest.model.XmlOrder;
public class ProcessOrder implements Processor {
private static final Logger logger = LoggerFactory.getLogger(ProcessOrder.class);
@Override
public void process(Exchange exchange) throws Exception {
Map<String, OrderHeader> headermap = exchange.getIn()
.getHeader(BindyFixedLengthDataFormat.CAMEL_BINDY_FIXED_LENGTH_HEADER, Map.class);
OrderHeader header = headermap.get(OrderHeader.class.getName());
logger.info("Processing order: {}", header.getId());
logger.info("...date1: {}", header.getDate1());
logger.info("...date2: {}", header.getDate2());
logger.info("...numberOfFile: {}", header.getNumerOfFile());
XmlOrder xmlorder = new XmlOrder(header, exchange.getIn().getBody(List.class));
exchange.getIn().setBody(xmlorder);
}
}
import java.util.List;
导入java.util.Map;
导入org.apache.camel.Exchange;
导入org.apache.camel.Processor;
导入org.apache.camel.dataformat.bindy.fixed.bindyfixedlingthdataformat;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.stefan.test.fixedlengthtest.model.OrderHeader;
导入com.stefan.test.fixedlengthtest.model.XmlOrder;
公共类ProcessOrder实现处理器{
私有静态最终记录器Logger=LoggerFactory.getLogger(ProcessOrder.class);
@凌驾
公共作废进程(Exchange)引发异常{
Map headermap=exchange.getIn()
.getHeader(BindyFixedLengthDataFormat.CAMEL\u BINDY\u FIXED\u LENGTH\u HEADER,Map.class);
OrderHeader=headermap.get(OrderHeader.class.getName());
info(“处理顺序:{}”,header.getId());
info(“…date1:{}”,header.getDate1());
info(“…date2:{}”,header.getDate2());
info(“…numberOfFile:{}”,header.getNumerOfFile());
XmlOrder XmlOrder=newxmlorder(头,exchange.getIn().getBody(List.class));
exchange.getIn().setBody(xmlorder);
}
}
此示例路由将输出如下内容:
[ main] ProcessOrder INFO Processing order: 31
[ main] ProcessOrder INFO ...date1: 2018-11-01T00:00:00.000+0200
[ main] ProcessOrder INFO ...date2: 2018-10-31T00:05:16.000+0200
[ main] ProcessOrder INFO ...numberOfFile: 3
[ main] data-route INFO Order:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xmlOrder>
<date1>2018-11-01T00:00:00+02:00</date1>
<date2>2018-10-31T00:05:16+02:00</date2>
<id>31</id>
<name>name</name>
<numerOfFile>3</numerOfFile>
<lines>
<count>13</count>
<foreignId>14</foreignId>
<id>10</id>
<lp>1</lp>
<priceByOne>1</priceByOne>
</lines>
<lines>
<count>14</count>
<foreignId>14</foreignId>
<id>20</id>
<lp>2</lp>
<priceByOne>1</priceByOne>
</lines>
<lines>
<count>15</count>
<foreignId>14</foreignId>
<id>30</id>
<lp>3</lp>
<priceByOne>1</priceByOne>
</lines>
</xmlOrder>
[ main] data-route INFO DATA processed
[main]处理订单信息处理订单:31
[main]处理订单信息…日期1:2018-11-01T00:00:00.000+0200
[main]处理订单信息…日期2:2018-10-31T00:05:16.000+0200
[main]处理订单信息…文件编号:3
[main]数据路由信息顺序:
2018-11-01T00:00:00+02:00
2018-10-31T00:05:16+02:00
31
名称
3.
13
14
10
1.
1.
14
14
20
2.
1.
15
14
30
3.
1.
[main]已处理的数据路由信息数据
您可以在中检查完整的源代码,您很可能无法在此处使用bindy,因为您的数据字段在第一行之后更改。最好的方法是编写一个简单的解析器bean来读取文件。@StefanR但这是怎么回事:案例6:带有页眉和页脚的固定长度记录,它不起作用吗?如果使用分隔符选项,则带有页眉的固定长度记录可能起作用。你需要对它进行测试才能找到答案。你能提供一些例子吗?我找不到任何东西:(非常感谢!是否可以用xml而不是java dsl来使用此路由?是的,可以将其实现为xml路由,但您仍然需要bindyDataFormat的java类。您能给我一个例子吗?您需要为这一点创建另一个问题。如果您只是在搜索,还有很多资源和教程可用让他们。。。。