簡體   English   中英

在使用多個標簽的情況下,如何使用Spring Batch有效地解析XML

[英]How to parse XML effectively using spring batch in case of mutiple tags

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

我引用了一些鏈接,但對如何解決該問題並沒有任何重要的想法。 請給我一些解決我的問題的方法,並提供一些參考。 提前致謝

就我而言,學生可以有N條記錄,而N的價值確實可以是巨大的。 我的要求是解析XML文件並將所有學生的詳細信息放入數據庫,並且由於我使用的是Spring Batch,所以我不想一次加載整個XMl文件。 由於記錄很多,我想批量讀取學生數據,比如說300個數據塊。

這就是Spring Batch 面向塊的處理模型的工作方式。

您需要配置一個面向塊的步驟,其塊大小為300。SpringBatch一次只能讀取300個內存中的XML項(而不是整個輸入文件),在讀取下一個塊之前先進行處理/寫入。

您可以在XML Input Output示例中使用StaxEventItemReader找到一個示例。 相關部分在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM