Spring 批处理的输出记录多于输入记录

Spring Batch more output records than input records

我正在使用 Spring Batch。我必须读取一些复杂的 xml 文件并将它们写入数据库。 xml 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<KCO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/DEV/schema.xsd">
    <Header/>
    <Body>
        <KC kc_id="">
            <KA ka_id="">
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                    <Va va_id="">
                        <Pa pa_id=""/>
                    </Va>
                </Kd>
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                </Kd>
            </KA>
            <KA ka_id="">
                <Kd kd_id="">
                    <Va va_id="">
                        <Pa pa_id=""/>
                        <Pa pa_id=""/>
                    </Va>
                </Kd>           
            </KA>
        </KC>
    </Body>
</KCO>

根元素是 KCO。对于每个 Pa 元素,我必须创建一个输出记录。该记录包含来自所有父元素(Va、Kd、KA、KC、Body 和 Header)的信息。 KA、Kd、Va 和 Pa 中有多个元素。我尝试在 ItemProcessor 中拆分 KC 元素,但这不是一个好主意,对吧?我在某处读到输入记录和输出记录的数量必须相等。 有没有人有解决这个问题的想法或模式?

这是我的代码:

@Bean
@StepScope
public StaxEventItemReader<KCO> itemReader(
        @Value("#{jobParameters['InputPath']}") String inputPath) {     
    return new StaxEventItemReaderBuilder<KCO>()
            .name("itemReader")
            .resource(new FileSystemResource(inputPath))
            .addFragmentRootElements("KCO")
            .unmarshaller(primaMarshaller())
            .build();
}

@Bean
public Jaxb2Marshaller primaMarshaller() {      
    Jaxb2Marshaller pm = new Jaxb2Marshaller();
    pm.setClassesToBeBound(KCO.class);      
    return pm;      
}

@Bean
public KMPItemProcessor itemProcessor() {
    return new KMPItemProcessor();
}

@Bean
public JpaItemWriter<KonditionMP> itemWriter() {
    JpaItemWriter<KonditionMP> writer = new JpaItemWriter<KonditionMP>();
    writer.setEntityManagerFactory(emf);
    return writer;
}

我的问题的答案在这里:

据此 Mahmoud Ben Hassine 评论。