Как эффективно анализировать XML с помощью весеннего пакета в случае нескольких тегов

У меня есть файл XML, который мне нужно проанализировать с помощью весеннего пакета, но я не уверен, как анализировать файлы в нескольких пакетах.

Пример того, как выглядит мой файл

<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-файл и поместить сведения обо всех студентах в базу данных, и, поскольку я использую весенний пакет, я не хочу сразу загружать весь XML-файл. Из-за большого количества записей я хочу читать данные о студентах партиями, скажем, размером 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
}

Я не уверен, выполнимо ли мое требование или нет, и если возможно, как мне закодировать мой 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;
    } 

Я ссылался на некоторые ссылки, но не получил никакого существенного представления о том, как подойти к проблеме. Пожалуйста, дайте мне какое-то решение для моей проблемы и некоторые ссылки для начала. заранее спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 848
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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.

Вот как работает порционно-ориентированная модель обработки Spring Batch.

Вам необходимо настроить шаг, ориентированный на фрагменты, с размером фрагмента 300. Spring Batch будет считывать только 300 элементов XML в памяти за раз (а не весь входной файл), обрабатывать/записывать их перед чтением следующего фрагмента.

Вы можете найти пример, используя StaxEventItemReader в образце Ввод XML-вывод. Соответствующий раздел — здесь.

Сэр, я использовал StaxEventItemReader, но он сразу считывает весь XML, включая часть заголовка, которая мне бесполезна. Я хочу игнорировать часть колледжа и просто анализировать часть студента по частям, используя пакет. Я задал еще один вопрос здесь stackoverflow.com/questions/56704041, подробно выделив все основные детали. Пожалуйста, посмотрите и мои извинения за то, что я не упомянул все пункты подробно

Anand 21.06.2019 15:16
but it reads the whole XML at once including the header part : Это не означает, что весь файл будет прочитан сразу. Вы устанавливаете FragmentRootElementName на student, поэтому будут считываться только теги student, другие теги будут игнорироваться программой чтения событий stax.
Mahmoud Ben Hassine 21.06.2019 16:57

Да, я заметил это в коде. Большое спасибо за помощь

Anand 23.06.2019 20:21

Другие вопросы по теме