Можно ли использовать StaxEventItemWriter для записи сложных XML-файлов?

#spring-batch

#spring-batch

Вопрос:

Я хочу написать XML в формате ниже:

 <Parent>
<TotalEmployees>2</TotalEmployees>
<CompanyName>ABCD</CompanyName>
<Employee>
<Name>YYYYY</Name>
<Details>
<EmployeeId>12345</EmployeeId>
<Job>Permanent</Job>
</Details>
</Employee>
<Employee>
<Name>XXXXX</Name>
<Details>
<EmployeeId>67892</EmployeeId>
<Job>Contract</Job>
</Details>
</Employee>
</Parent>
 

Фрагментация сотрудника будет повторяться, и общее количество статистических данных о сотрудниках будет представлено в totalCount (вычисленное значение).

Возможно ли это с помощью StaxItemWriter или мне следует использовать пользовательский ItemWriter. Я пытался использовать headercallback, но это не помогло. Пожалуйста, направьте меня.

Комментарии:

1. Чтобы записать общее количество записей в заголовке, вам нужно рассчитать его заранее. Откуда вы читаете элементы? Можете ли вы заранее рассчитать общее количество элементов?

2. @MahmoudBenHassine: я считываю записи из базы данных, но я фильтрую некоторые в процессоре на основе определенных условий. Возможно ли передать общее количество записей от процессора к записывающему устройству?

3. Почему вы не фильтруете эти записи в самом запросе? Неэффективно захватывать записи в памяти приложения и фильтровать их в процессоре. Если вам удастся выбрать только те элементы, которые должны быть записаны, вы можете создать шаг, который выполняет select count(*) from table where ... , и поместить эту информацию в контекст выполнения. Теперь ваш шаг, ориентированный на фрагменты, может считывать общее количество элементов из контекста выполнения и записывать его в заголовок.

4. @MahmoudBenHassine: Спасибо за ваш подробный ответ. Проблема в том, что я должен выбирать из базы данных на основе определенных условий и фильтровать их, сравнивая записи, которые я получаю из другого входного файла (файла CSV) из внешней системы, а затем записывать в XML. Поэтому у меня нет возможности фильтровать в запросе выбора. Иначе мне пришлось бы сначала записывать из CSV в DB, а затем записывать то, что я извлекаю из нового запроса select. Но для этого мне снова пришлось бы создать новую таблицу.

5. Понятно. В этом случае вам нужно найти способ вычислить общее количество элементов, которые будут записаны перед записью заголовка.