在春季批处理中读取带有页眉和页脚的XML文件

我正在编写批处理作业,以读取带有页眉和页脚的XML文件。

<?xml version="1.0" encoding="utf-8"?>
<File>
  <Hdr>
    <hdrField1>1644</hdrField1>
    <hdrField2>670</hdrField2>
    <hdrField3>00000001</hdrField3>
  </Hdr>
  <TxnBlock>
    <Txn>
        <txnField1>1644</txnField1>
        <txnField2>670</txnField2>
        <txnField3>00000001</txnField3>
    </Txn>
    <Txn>
    ...............
    </Txn>
    <Txn>
    ...............
    </Txn>
  </TxnBlock>
  <Trl>
    <trlField1>1644</trlField1>
    <trlField2>670</trlField2>
    <trlField3>00000001</trlField3>
  </Trl>
</File>

我正在使用Jaxb2Marshaller

@StepScope
    public StaxEventItemReader<XmlVo> xmlReader()
            throws MalformedURLException {

        String fileName="011SBIN00200011924701.xml";
        StaxEventItemReader<XmlVo> reader = new StaxEventItemReader<>();
        reader.setResource(new FileSystemResource(fileName));
        reader.setfragmentRootElementNames(new String[] { "File","Hdr","Trl","Txn" });
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(XmlVo.class,HeaderVo.class,FooterVo.class,TxnVo.class);
        reader.setUnmarshaller(marshaller);

        return reader;
    }


@XmlRootElement(name = "File")
@XmlaccessorType(XmlaccessType.FIELD)
public class XmlVo {        

      @XmlElement(name="Hdr") 
      private HeaderVo Hdr;

      @XmlElement(name="Trl") 
      private FooterVo Trl;

      @XmlElement(name="TxnBlock") 
      private TxnBlockVo TxnBlock;

      /*@XmlElement(name="Txn") //
       private List<TxnVo> txn;*/


//getter setter
}

@XmlRootElement(name = "TxnBlock")
@XmlaccessorType(XmlaccessType.FIELD)
public class TxnBlockVo {

    @XmlElement(name="Txn") //
    private List<TxnVo> txn;

   //getter setter
}

我能够从文件中读取数据。 问题是我没有大块的记录。我的块大小为5,文件包含近1000个Txn片段,但是整个文件却作为一个读取。

我尝试将List<TxnVo>放在XmlVo.class中。但是,当我尝试从Txn列表中读取值时,处理器中会发生nullpoint异常。

仅读取Txn片段时,处理是完美的。但是我还需要阅读页眉和页脚。

我的处理是否正确?
如何在具有页眉和页脚记录的xml文件中实现批处理?

预先感谢。?

iseehr 回答:在春季批处理中读取带有页眉和页脚的XML文件

这不是StaxEventItemReader设计的工作方式。假定一个XML片段(可以根据需要复杂)可以与一个项目相对应。以下是参考文档的XML Item Readers and Writers部分的摘录:

  

假定XML资源是与各个记录相对应的“片段”的集合

对于您的情况,对于每条记录,您都希望从标题(文件的开头)+片段(文件的中间位置)+页脚(文件的结尾)映射项目。这要求阅读器在输入文件中来回移动,该输入文件与项目阅读器的合同不符,只能按照文档here中的说明进行转发:

  

预计ItemReader接口的实现仅向前。

因此,在您的情况下,您需要更新映射以符合StaxEventItemReader的要求或编写自定义阅读器。

本文链接:https://www.f2er.com/3159077.html

大家都在问