使用BeanIO在单个文件中解析多个对象

时间:2018-01-15 16:35:57

标签: java apache-camel fileparsing bean-io

我在文件中有以下两种类型的记录,我可以使用BeanIO为记录类型1或2中的任何一种解析此文件,但我不能在一个光标中同时执行这两种操作。我不会知道如何在单个记录中使用我的两个映射。请指导我做。感谢。

1   Length(20)    5       5        5      5      5
    Columns     S.No    Name    Street  City    Zip

2   Columns     S.No    Age Position        
    Length(20)    5      2   18 

mapping.xml

<record name="employee" class="com.Employee" collection="list" minOccurs="1" maxOccurs="unbounded">
<field name="S.No" length="5" />
<field name="Name" length="5" />
<field name="Street" length="5" />
<field name="City" length="5" />
<field name="Zip" length="5" />
</record>

<record name="employee" class="com.Employee" collection="list" minOccurs="1" maxOccurs="unbounded">
<field name="S.No" length="5" />
<field name="Age" length="2" />
<field name="Position" length="12" />
</record>

Update1:​​我们可以使用S.No 区分记录 没有记录顺序也没有记录之间的依赖。

    001  Jose Str1 City 56005
    001  Hene Str1 City 66005
    005  20 General Manager  
    001  King Str1 City 76005
    005  20 General Manager  
    001  Leo  Str1 City 86005
    005  90 COO                
    005  70 Deputy Manager

2 个答案:

答案 0 :(得分:0)

您好我在BeanIO解析器中遇到了同样的问题。我只是在

中使用minOccurs =“0”

请执行以下操作:

不要使用两个只使用一个:

<record name="employee" class="com.Employee" collection="list" minOccurs="1" maxOccurs="unbounded">
<field name="S.No" length="5"/>
<field name="Name" length="5" minOccurs="0"/>
<field name="Street" length="5" minOccurs="0"/>
<field name="City" length="5" minOccurs="0"/>
<field name="Zip" length="5" minOccurs="0"/>
<field name="Age" length="2" minOccurs="0"/>
<field name="Position" length="12" minOccurs="0"/>

如果某个字段中没有记录,则它会在POJO / Bean中存储默认类型值。

这是我的Drive Link示例,只需使用它:

https://drive.google.com/drive/folders/1SFSEWUVpSaAFHgYxR1PExCscimMtWpwf?usp=sharing

或用作参考:

Continue parsing of records if exception occurs on some record in BeanIO

答案 1 :(得分:0)

您需要一个包含Employee条记录

列表的类
public class EmployeeGroup {

  private List<Employee> employees;
  // getter + setter
}

然后,您需要group中的mapping.xml定义才能阅读所有Employee条记录

<stream name="example" format="fixedlength">
  <group name="employeeGroup" class="com.EmployeeGroup">
    <record name="employees" class="com.Employee" minOccurs="1" maxOccurs="unbounded" collection="list">
      <field name="S.No" length="5" rid="true" literal="001"/>
      <field name="Name" length="5"/>
      <field name="Street" length="5"/>
      <field name="City" length="5"/>
      <field name="Zip" length="5"/>
    </record>
    <record name="employees" class="com.Employee" minOccurs="1" maxOccurs="unbounded" collection="list">
      <field name="S.No" length="5" rid="true" literal="005"/>
      <field name="Age" length="2"/>
      <field name="Position" length="12"/>
    </record>
  </group>
</stream>

请注意literal属性的值,以标识不同的记录。