我正在编写批处理作业,以读取带有页眉和页脚的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文件中实现批处理?
预先感谢。?