多条线路上的一条记录,只有RID第一条记录
问题描述:
我是使用BeanIO 2.1的全新产品,我又遇到了一个问题。多条线路上的一条记录,只有RID第一条记录
我试图解码一个固定长度的文件,它具有传播上几行,这里的“摆脱”只标注在第一这些线路的一些记录
例子:
:10:BLABLABLABLA
:11:/TRTP/SEPA OVERBOEKING/IBAN
HR W HERMAN
503270327C30,49NTRFSCT20111212
:12:BLABLABLABLA
正如你所看到的,记录':11:'分布在3条线上。 我想抓住这些线作为一个字符串列表,其中摆脱':11:'将被忽略。
这是mapping.xml文件:
<record name="ownerInformation" order="2" class="com.batch.records.OwnerInformation" minOccurs="1" maxOccurs="6" collection="list">
<field name="tag" type="string" length="4" rid="true" literal=":11:" ignore="true" />
<field name="description" type="string" length="unbounded" maxLength="65" />
</record>
结果,异常UnexpectedRecordException:
org.beanio.UnexpectedRecordException:流的末尾达到预期的记录 'ownerInformation'
再次感谢您的帮助
答
有可能Map Bean Objects that Span Multiple Records。
您将不得不为每条线创建记录ID,例如: 我使用commans来分隔字段。
11,/TRTP/SEPA OVERBOEKING/IBAN
12,HR W HERMAN
13,503270327C30
13,49NTRFSCT20111212
事情是这样的:
<group name=ownerInfo class="com.batch.records.OwnerInformation" minOccurs="1" maxOccurs="6">
<record name="typeInfo" class="com.batch.records.Type" order="1" minOccurs="1" maxOccurs="1" >
<field name="recordType" rid="true" literal="11" ignore="true" />
<field name="iban" />
</record>
<record name="customer" class="com.batch.records.Customer" order="2" minOccurs="1" maxOccurs="1" >
<field name="recordType" rid="true" literal="12" ignore="true" />
<field name="name" />
</record>
<record name="items" class="com.batch.records.Item" collection="list" order="3" minOccurs="1" maxOccurs="unbounded" >
<field name="recordType" rid="true" literal="13" ignore="true" />
<field name="id" />
</record>
</group>
这将映射到OwnerInformation
这样的:
package com.batch.records;
/* Getters and Setter are omitted for brevity */
public class OwnerInformation {
Type type;
Customer customer;
List<Item> items;
}
public class Type {
String iban;
}
public class Customer {
String name;
}
public class Item {
String id;
}
答
一种方法是绘制出你不需要的线条和因此它包括你想从数据中得到的内容。以下是可以按原样处理不同记录类型的映射。这会为您提供正在查找的正确订单项。
请注意,您对每行有一个“删除”,对于您的数据行,您基本上使用正则表达式来表示“任何不以冒号开头的内容”。在你的“而阅读()”代码,你可以用你的跳闸逻辑:
if (reader.getRecordName().equals("record11"))
或映射走得更远,并添加组。
这里的mapping.xml区分你行,你需要:
<beanio xmlns="http://www.beanio.org/2012/03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd">
<stream name="fabizFile" format="fixedlength">
<record name="record10">
<field name="recordType" rid="true" literal=":10:" />
<field name="sometext" length="12" />
</record>
<record name="record11">
<field name="recordType" rid="true" literal=":11:" />
<field name="sometext" length="unbounded" maxLength="40" />
</record>
<record name="record12">
<field name="recordType" rid="true" literal=":12:" />
<field name="sometext" length="unbounded" maxLength="40" />
</record>
<record name="goodstuff" class="FabizModel">
<field name="recordText" rid="true" regex="^(?!:).+" length="unbounded" maxLength="50" />
</record>
</stream>
</beanio>
你好,感谢您的回复。最后我去了一个小组,其中第一个记录确实是一个字面值为11的记录:下面的行记录不受任何前缀限制。这样我就可以在一个地方找到所有信息的单个对象。 – Fabiz