gpt4 book ai didi

java - 如何在多个标签的情况下使用 Spring Batch 有效解析 XML

转载 作者:行者123 更新时间:2023-12-02 04:09:39 25 4
gpt4 key购买 nike

我有一个 XML 文件,我必须使用 Spring Batch 来解析该文件,但我不知道如何分批解析该文件。

我的文件的示例

<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 文件。由于记录数量较多,我想批量读取学生数据,假设 block 大小为 300。我的 Java POJO 如下所示

信息.java

@XmlRootElement(name="information")
public class Information
{
@XmlElement(name="college")
private College college;

@XStreamAlias("student")
private List<Student> student;

... getter, setter and constructor
}

我不确定我的要求是否可行,如果可行,我应该如何在 Spring Batch 配置中为我的 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;
}

我引用了一些链接,但没有得到任何重要的想法如何解决这个问题。请为我的问题提供一些解决方案并提供一些引用。提前致谢

最佳答案

For my case there can be N number of records for student and the value of N can be really huge. My requirement is to parse the XML file and put the details of all the students into database and since i am using spring batch i don't want to load the whole XMl file at once. Due to large number of records i want to read the student data in batches let's say in a chunk size of 300.

这就是chunk-oriented processing model的方式Spring Batch 作品的一部分。

您需要配置一个面向 block 的步骤, block 大小为 300。Spring Batch 一次只会读取内存中的 300 个 XML 项目(而不是整个输入文件),在读取下一个之前处理/写入它们 block 。

您可以在 XML Input Output 中找到使用 StaxEventItemReader 的示例。样本。相关部分是here .

关于java - 如何在多个标签的情况下使用 Spring Batch 有效解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56698165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com