【问题标题】:StaxEventItemWriter for spitting big XML files with headerStaxEventItemWriter 用于吐出带有标题的大 XML 文件
【发布时间】:2021-02-05 22:21:05
【问题描述】:

我需要将一些旧的 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,然后我就可以为每个输出文件添加标题,对吗?

【问题讨论】:

  • 这是一种可行的方法,但为什么不为自己节省大量低级编码并改用流式 XSLT 3.0 转换呢?
  • 分割文件的标准是什么?是元素的数量,输出文件的大小等吗?所有输入文件(Big1File.xml、Big2File.xml 等)的标题是否相同,还是需要从每个输入文件中动态解析?
  • 感谢@MichaelKay 的提问,但我认为使用 StaxEventItems 我可以轻松完成!
  • 感谢@MahmoudBenHassine 的提问!现在的标准是元素的数量。例如,将每个大文件拆分为只有 5k 个元素的小文件。每个大文件的标题都不一样,我必须把这个标题放在每个小文件中。

标签: java xml spring spring-batch stax


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多