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

マッピング ファイルを少し調整するだけです。属性をに設定し、属性を に設定して、shippingDetailセグメントが繰り返し可能なセグメントであることを BeanIO に伝える必要があります。maxOccursunboundedcollectionlist

詳細については、繰り返しセグメントのドキュメントを参照してください。

繰り返しフィールドと同様に、BeanIO は、Bean オブジェクトのコレクションにバインドできる繰り返しセグメントをサポートします。

マッピング ファイルで、セグメントをコレクションにバインドするには、そのコレクション属性を java.util.Collection または java.util.Map サブクラスの完全修飾クラス名、またはコレクション型エイリアスの 1 つに設定するだけです。

繰り返しセグメントは、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 に答える