У меня есть файл 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;
}
Я ссылался на некоторые ссылки, но не получил никакого существенного представления о том, как подойти к проблеме. Пожалуйста, дайте мне какое-то решение для моей проблемы и некоторые ссылки для начала. заранее спасибо
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-вывод. Соответствующий раздел — здесь.
but it reads the whole XML at once including the header part
: Это не означает, что весь файл будет прочитан сразу. Вы устанавливаете FragmentRootElementName
на student
, поэтому будут считываться только теги student
, другие теги будут игнорироваться программой чтения событий stax.
Да, я заметил это в коде. Большое спасибо за помощь
Сэр, я использовал StaxEventItemReader, но он сразу считывает весь XML, включая часть заголовка, которая мне бесполезна. Я хочу игнорировать часть колледжа и просто анализировать часть студента по частям, используя пакет. Я задал еще один вопрос здесь stackoverflow.com/questions/56704041, подробно выделив все основные детали. Пожалуйста, посмотрите и мои извинения за то, что я не упомянул все пункты подробно