【问题标题】:Multiple Objects parsing in single file using BeanIO使用 BeanIO 在单个文件中解析多个对象
【发布时间】:2018-01-15 16:35:57
【问题描述】:

我在一个文件中有以下 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 

ma​​pping.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

【问题讨论】:

  • 输入文件中的数据是如何组织的?首先 x 记录 1 行,然后 y 记录 2 行?另外,为什么两条记录的记录名称和类别相同?理想情况下,这些应该是不同的。
  • 想想你将如何识别每条记录?
  • 请查找更新,我们可以用S.No区分记录

标签: java apache-camel fileparsing bean-io


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

【讨论】:

  • 但这将创建不同的格式输出,我的输出长度应该始终为 18,正如我给出的问题。感谢您的回复。
  • @sunleo 您可以使用记录的 maxOccurs 或 minOccurs 调整长度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多