1

我正在尝试为包含多个重复段的固定长度文件创建映射文件。问题是,这些片段中的多个片段被无限次重复,beanio 不支持平面文件。我理解,这是有充分理由的,因为 beanio 只能对片段重复的频率做这么多的猜测。

然而,每个段的重复次数存在于文件中,在重复段发生之前的位置,所以我试图弄清楚是否有办法从流中读取该数字,然后填充“minOccurs”和具有正确值的以下段的“maxOccurs”属性。基本上我的映射文件看起来像:

<beanio>
  <stream name="employeeFile" format="fixedlength">
    <record name="record1" class="example.Record1">
      <field name="field1" length="10"/>
      <field name="field2" length="2"/>
      <field name="length1" length="2"/>
      <segment name="list1" collection="list" minOccurs="1" maxOccurs="unbounded" class="example.List1">
        ...
      </segment>
      <field name="length2" length="2"/>
      <segment name="list2" collection="list" minOccurs="1" maxOccurs="unbounded" class="example.List2">
        ...
      </segment>
    </record> 
  </stream>
</beanio>

我现在需要一些方法来使用字段 length1 和 length2 的值作为段中的“maxOccurs”属性。我相当肯定没有“官方”的方式来获得这种行为,但到目前为止我还没有想出一个更优雅的解决方案。

我的一个想法是创建一个程序,从文件中加载每个段的重复次数,然后在映射文件上执行搜索替换,然后在 beanio 中加载它,但这似乎是一种非常复杂的做事方式.

谢谢,松克

4

1 回答 1

3

自己找到了答案。我正在阅读 2.0 版的 beanio 参考文档,而不是 2.1 版,它介绍了我正在寻找的功能。

参考文件指出:

如果一个字段基于同一记录中的前一个字段重复了固定次数,则可以使用occurrenceRef属性来标识控制字段的名称。如果控制字段未绑定到其父 bean 对象的单独属性,请务必指定 ignore="true"。以下映射文件显示如何将帐户字段的出现配置为依赖于 numberOfAccounts 字段。如果需要,仍可以指定 minOccurs 和 maxOccurs 以验证引用的字段出现值。

所以可以使用:

<field name="accounts" type="int" collection="list" occursRef="numberOfAccounts" />

以获得预期的结果。

我认为这个属性不适用于 xml 流,因为这里并不需要它。我不小心尝试将其添加到映射文件中并得到异常而不是正确的错误消息。

于 2013-07-11T20:56:06.660 回答