首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理xml平面文件中的内部元素列表的Beanio流

处理xml平面文件中的内部元素列表的Beanio流
EN

Stack Overflow用户
提问于 2019-08-29 11:12:52
回答 1查看 1.6K关注 0票数 0

我对beanio很陌生。有人能帮我一下吗。我正在尝试处理输入文件,该文件如下所示,其中数据元素中存在许多Item元素:

代码语言:javascript
运行
复制
<?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中的流如下所示:

代码语言:javascript
运行
复制
<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元素值被处理并且程序退出。有没有办法,我可以处理所有的项目元素?下面是用于填充BeanReader对象的代码:

代码语言:javascript
运行
复制
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文件中检索记录。

代码语言:javascript
运行
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2019-08-29 16:31:04

您只需要对映射文件做一个小的调整。您必须告诉BeanIO,shippingDetail段是一个可重复的段,方法是将maxOccurs属性设置为unbounded,并将collection属性设置为list

有关更多细节,请参见重复段文档,实质是:

与重复字段类似,BeanIO支持重复段,这些片段可以绑定到bean对象的集合。 在映射文件中,为了将段绑定到集合,只需将其集合属性设置为java.util.Collection或java.util.Map子类的完全限定类名,或设置为集合类型别名之一 重复段可以使用minOccurs和maxOccurs属性声明出现的次数。如果未声明,minOccurs将默认为1,而maxOccurs将默认为minOccurs值或1,两者以较大者为准。

然后,您的shippingDetail段变成:

代码语言:javascript
运行
复制
<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>

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57708916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档