我可以从正在处理的流中读取段的maxOccurs属性吗



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

但是,每个段的重复次数都存在于文件中重复段出现之前的位置,因此我试图弄清楚是否有方法从流中读取该数字,然后用正确的值填充以下段的"minOccurs"one_answers"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中,然而这似乎是一种非常复杂的方法。

谢谢,Sönke

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

参考文件指出:

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

因此可以使用:

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

以获得预期结果。

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

相关内容

  • 没有找到相关文章

最新更新