StaxEventItemWriter 用于吐出带有标题的大型 XML 文件

问题描述

我需要将一些旧的 java 批次迁移到 spring 批次。这些旧批次正在读取大型 XML 文件 ( >1gb ) 并将它们拆分为小型 XML 文件。所以我们有以下场景:

  1. 输入:Big1File.xml -> 输出:Small1.1File.xml、Small1.2File.xml、 Small1.3File.xml
  2. 输入:Big2File.xml -> 输出:Small2.1File.xml,Small2.2File.xml
  3. 输入:Big3File.xml -> 输出:Small3.1File.xml、Small3.2File.xml、 Small3.3File.xml,Small3.4File.xml

这个xml文件的结构总是一样的:

<?xml version="1.0"?>
 <info>
  <header>
   <headerField1></headerField1>
   <headerField2></headerField2>
  </header>
  <elements>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
    ....
  </elements>
 </info>

我一直在阅读有关 StaxEventItemReader 和 StaxEventItemWriter 的文档和示例,但我不确定是否可以使用 Writer 的认版本。

StaxEventItem 类是否是拆分此类 xml 文件的好选择?

通常示例是没有标题元素的 xml,基本上是带有元素列表的 xml:

<?xml version="1.0"?>
 <info>
  <elements>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
   <element>
    <elementField1></elementField1>
    <elementField2></elementField2>
    <elementField3></elementField3>
   </element>
    ....
  </elements>
 </info>

如果我没有错,我需要做的是扩展 StaxEventItemWriter,然后我就可以为每个输出文件添加标题,我正确吗?

解决方法

您可以使用委托给 StaxEventItemWriterMultiResourceItemWriter。要限制每个文件的元素数量,您可以将 itemCountLimitPerResource 参数设置为 5000。

对于标头,您需要创建一个单独的步骤,从文件中动态提取它并将其传递给委托编写器。我与平面文件编写器 here 分享了一个示例,但您可以将其改编为 xml 编写器。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...