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

Multiple Objects parsing in single file using BeanIO

我在一个文件中有以下 2 种类型的记录,我可以使用 BeanIO 解析此文件以获取记录类型 1 或 2 中的任何一种,但我无法在一个 parsor.I 中同时完成这两种记录'知道如何在单个记录中使用我的两个映射。请指导我做it.Thanks.

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

您好,我在 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中。

这是我的驱动器示例 Link 只需使用它:

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

或用作参考:

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

您需要一个 class 包含您的 Employee 条记录的列表

public class EmployeeGroup {

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

那么你需要在 mapping.xml 中定义一个 group 来读取所有 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 属性的值以识别不同的记录。