【发布时间】:2019-12-17 15:20:41
【问题描述】:
我正在使用 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;
}
【问题讨论】:
-
Somewhere I read that the amount of input records and output records has to be equal这没有必要。一个输入项可以转换为多个输出项,您最终会得到比输入记录更多的输出记录。如果你设法让你的项目处理器返回每个项目的记录列表,那么你可以使用这样的东西:*.com/questions/37866312/… -
@MahmoudBenHassine:谢谢,这个技巧对我帮助很大。
标签: java xml jpa spring-batch