【发布时间】:2021-02-05 22:21:05
【问题描述】:
我需要将一些旧的 java 批处理迁移到 spring 批处理。这些旧批次正在读取大 XML 文件 ( >1gb ) 并将它们拆分为小的 XML 文件。所以我们有以下场景:
- 输入:Big1File.xml -> 输出:Small1.1File.xml , Small1.2File.xml , Small1.3File.xml
- 输入:Big2File.xml -> 输出:Small2.1File.xml , Small2.2File.xml
- 输入: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