0

我在一个文件中有以下 2 种类型的记录,我可以使用 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 

映射.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>

更新1:我们可以使用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
4

2 回答 2

1

您需要有一个包含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属性的值以识别不同的记录。

于 2018-01-16T15:05:23.513 回答
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

或用作参考:

如果 BeanIO 中的某些记录发生异常,则继续解析记录

于 2018-01-16T07:17:15.920 回答