#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. Понятно. В этом случае вам нужно найти способ вычислить общее количество элементов, которые будут записаны перед записью заголовка.