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

时间:2019-06-21 06:42:27

标签: java xml spring-boot spring-batch

我有一个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;
    } 

我引用了一些链接,但对如何解决该问题并没有任何重要的想法。请给我一些解决我的问题的方法,并提供一些参考。预先感谢

1 个答案:

答案 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