0

我是 beanio 的新手。有人可以帮我解决这个问题。我正在尝试处理输入文件,如下所示,其中 Data 元素中存在的 Item 元素很多:

<?xml version="1.0" encoding="windows-1252"?>
<ROOT xmlns="http://www.post.ch/schemas/dfu/2006/20/Report11">
<Sender>
<Provider>
<Data>
<Item SendingID="314" ItemID="996099999902916713" IdentCode="996099999902916713" AdrZ1="Meier" AdrZ2="" AdrZ3="" AdrZ4="Dorfweg" AdrZ5="6" AdrZ6="4117" AdrZ7="Burg im Leimental" DFUTransferDateTime="2019-07-18T13:24:56" ItemWeight="480" EventDateTime="2019-07-22T04:13:59" EventNumber="9209" EventDescription="Ordre voisin souhaité" EventNumber_Sub="" Event_SubDescription="" EventZipCode="303001" PrZl="SAZU" DeliveredTo="" TrackAndTrace="https://service.post.ch/EasyTrack/secure/GKDirectSearch.do?formattedParcelCodes=996099999902916713;&amp;lang=fr" Status="31" StatusDescription="Prêt pour la distribution" ExpectedDeliveryDate="27.07.19" DeadlinePickup="" />
<Item SendingID="313" ItemID="996099999902916585" IdentCode="996099999902916585" AdrZ1="Müllerer" AdrZ2="" AdrZ3="" AdrZ4="Gärischstrasse" AdrZ5="27" AdrZ6="4512" AdrZ7="Bellach" DFUTransferDateTime="2019-07-17T13:51:23" ItemWeight="1080" EventDateTime="2019-07-22T07:32:59" EventNumber="4000" EventDescription="Distribué" EventNumber_Sub="" Event_SubDescription="" EventZipCode="462070" PrZl="" DeliveredTo=" " TrackAndTrace="https://service.post.ch/EasyTrack/secure/GKDirectSearch.do?formattedParcelCodes=996099999902916585;&amp;lang=fr" Status="61" StatusDescription="Distribué" ExpectedDeliveryDate="22.07.19" DeadlinePickup="" />
</Data>
</Provider>
</Sender>
</ROOT>

我在 beanio xml 中的流如下所示:

<stream name="swisspost" format="xml" xmlName="ROOT" xmlNamespace="http://www.post.ch/schemas/dfu/2006/20/Report11">
    <record name="shippingData" xmlName="Sender" class="com.test.eventproc.carrier.data.ShippingDataDO">
        <property name="carrierMoniker" value="swisspost"/>
        <segment name="Provider">
            <segment name="Data">
                <segment name="Item">
                    <field name="trackingNumber" xmlName="IdentCode" xmlType="attribute"></field>
                </segment>
                <segment name="shippingDetail" xmlName="Item" xmlType="element" class="com.test.eventproc.carrier.data.ShippingDetailDO">
                    <field name="trackingNumber" xmlName="IdentCode" xmlType="attribute"></field>
                    <field name="eventCode" xmlName="EventNumber" xmlType="attribute"></field>
                    <field name="eventDate" xmlName="EventDateTime" xmlType="attribute"></field>
                    <field name="eventName" xmlName="EventDescription" xmlType="attribute"></field>
                </segment>
            </segment>
        </segment>
    </record>
</stream>

根据我上面的流,只处理第一个 Item 元素值并且程序退出。有没有办法,我可以处理所有的 Item 元素?下面是代码,我用来填充 BeanReader 对象:

StreamFactory factory = StreamFactory.newInstance();
            factory.loadResource("mapping.xml");//mapping.xml is my bean-io mapping file.

            File originalFile = convert(file);//file is the input xml flat file
            FileInputStream inputStream = new FileInputStream(originalFile);
            BeanReader reader = factory.createReader(streamName, new InputStreamReader(inputStream));
            Object record;
            List<ShippingDataDO> shippingDataDOs = new ArrayList<ShippingDataDO>();

            while ((record = reader.read()) != null) {
                ShippingDataDO shippingDataDO = (ShippingDataDO) record;
                shippingDataDOs.add(shippingDataDO);
            }

我尝试映射 xml 如下所示。但是,现在没有从输入平面 xml 文件中检索到任何记录。

<stream name="swisspost" format="xml" xmlName="ROOT" xmlNamespace="http://www.post.ch/schemas/dfu/2006/20/Report11">
        <record name="Sender">
            <segment name="Provider">
                <segment name="Data">
                    <segment name="shippingData" xmlName="Item" maxOccurs="unbounded" collection="list" class="com.narvar.carrier.utilities.pojo.ShippingDataDO">
                        <property name="carrierMoniker" value="swisspost"/>
                        <field name="trackingNumber" xmlName="IdentCode" xmlType="attribute"></field>
                    </segment>
                    <segment name="shippingDetail" xmlName="Item" xmlType="element" maxOccurs="unbounded" class="com.narvar.carrier.utilities.pojo.ShippingDetailDO" collection="list">
                        <field name="trackingNumber" xmlName="IdentCode" xmlType="attribute"></field>
                        <field name="eventCode" xmlName="EventNumber" xmlType="attribute"></field>
                        <field name="eventDate" xmlName="EventDateTime" xmlType="attribute"></field>
                        <field name="eventName" xmlName="EventDescription" xmlType="attribute"></field>
                    </segment>
                </segment>
            </segment>
        </record>
    </stream>
4

1 回答 1

1

你只需要对你的映射文件做一个小的调整。您必须通过将属性设置为 并将属性设置为来告诉 BeanIO 该shippingDetail段是可重复段。maxOccursunboundedcollectionlist

有关更多详细信息,请参阅重复段文档,实质上是:

与重复字段类似,BeanIO 支持重复段,可以绑定到 bean 对象的集合。

在我们的映射文件中,为了将段绑定到集合,只需将其集合属性设置为 java.util.Collection 或 java.util.Map 子类的完全限定类名,或集合类型别名之一

重复段可以使用 minOccurs 和 maxOccurs 属性声明出现次数。如果未声明,minOccurs 将默认为 1,maxOccurs 将默认为 minOccurs 值或 1,以较大者为准。

然后您的shippingDetail细分变为:

<segment name="shippingDetail" xmlName="Item" xmlType="element" maxOccurs="unbounded"
         class="com.test.eventproc.carrier.data.ShippingDetailDO" collection="list">
  <field name="trackingNumber" xmlName="IdentCode" xmlType="attribute"></field>
  <field name="eventCode" xmlName="EventNumber" xmlType="attribute"></field>
  <field name="eventDate" xmlName="EventDateTime" xmlType="attribute"></field>
  <field name="eventName" xmlName="EventDescription" xmlType="attribute"></field>
</segment>

希望这有帮助!

于 2019-08-29T16:31:04.517 回答