我有一个XML文件,我必须使用Spring批处理来解析,但是我不确定如何以多个批处理来解析文件。
文件外观示例
<information>
<college>
<header info>
</college>
<student>
<student 1 info>
</student>
<student>
<student 2 info>
</student>
<student>
<student 3 info>
</student>
</information>
学生记录样本
<student>
<name>Tony Tester</name>
<rollNo>1</rollNo>
<enrollmentDate>2016-10-31</enrollmentDate>
<sampleTimeStamp>2016-11-07T05:50:45</sampleTimeStamp>
<salary>16.57</salary>
</student>
就我而言,学生可以有N条记录,而N的价值确实可以是巨大的。我的要求是解析XML文件并将所有学生的详细信息放入数据库,并且由于我使用的是Spring Batch,所以我不想一次加载整个XMl文件。由于记录很多,我想批量读取学生数据,比方说,数据块大小为300。我的Java POJO看起来像
Information.java
@XmlRootElement(name="information")
public class Information
{
@XmlElement(name="college")
private College college;
@XStreamAlias("student")
private List<Student> student;
... getter, setter and constructor
}
我不确定我的要求是否可行,如果可行,我应该如何在spring批处理配置中为我的itemReader编码。现在,我尝试只读取没有和大学标签的学生数据,对于这种实现,我的读者看起来像
ItemReader
@StepScope
@Bean(name="xmlReader")
public SynchronizedItemStreamReader<StudentDTO> reader()
{
StaxEventItemReader<StudentDTO> xmlFileReader = new StaxEventItemReader<>();
xmlFileReader.setResource(new ClassPathResource("students.xml"));
xmlFileReader.setFragmentRootElementName("student");
Map<String, Class<?>> aliases = new HashMap<>();
aliases.put("student", StudentDTO.class);
StudentConverter converter = new StudentConverter();
XStreamMarshaller xStreamMarshaller = new XStreamMarshaller();
xStreamMarshaller.setAliases(aliases);
xStreamMarshaller.setConverters(converter);
xStreamMarshaller.getXStream().addPermission(NoTypePermission.NONE);
xStreamMarshaller.getXStream().addPermission(NullPermission.NULL);
xStreamMarshaller.getXStream().addPermission(PrimitiveTypePermission.PRIMITIVES);
xStreamMarshaller.getXStream().allowTypeHierarchy(Collection.class);
xStreamMarshaller.getXStream().allowTypesByWildcard(new String[] {"com.example.demo.**"});
xmlFileReader.setUnmarshaller(xStreamMarshaller);
SynchronizedItemStreamReader< StudentDTO> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
synchronizedItemStreamReader.setDelegate(xmlFileReader);
return synchronizedItemStreamReader;
}
我引用了一些链接,但对如何解决该问题并没有任何重要的想法。请给我一些解决我的问题的方法,并提供一些参考。预先感谢
答案 0 :(得分:0)
就我而言,学生可以有N条记录,而N的价值确实可以是巨大的。我的要求是解析XML文件并将所有学生的详细信息放入数据库,并且由于我使用的是Spring Batch,所以我不想一次加载整个XMl文件。由于记录很多,我想批量读取学生数据,比如说300个数据块。
Spring Batch chunk-oriented processing model的工作方式。
您需要配置一个面向块的步骤,其块大小为300。SpringBatch一次只能读取300个内存中的XML项(而不是整个输入文件),在读取下一个之前要进行处理/写入。块。
您可以在XML Input Output示例中使用Option Explicit
Sub CutCopyPaste()
Dim lrow As Long
Dim ws
Set ws = ThisWorkbook.Sheets("TestSheet2")
With ThisWorkbook.Sheets("Testsheet1")
lrow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:A" & lrow).AutoFilter Field:=1, Criteria1:="Test"
.Range("A1:A" & lrow).SpecialCells(xlCellTypeVisible).EntireRow.Cut ws.Range("A1")
End With
End Sub
找到一个示例。相关部分为here。