Чтение XML-файла с заголовком и нижним колонтитулом в весеннем пакете - PullRequest
0 голосов
/ 05 ноября 2019

Я пишу пакетное задание для чтения XML-файла с верхним и нижним колонтитулом.

<?xml version="1.0" encoding="utf-8"?>
<File>
  <Hdr>
    <hdrField1>1644</hdrField1>
    <hdrField2>670</hdrField2>
    <hdrField3>00000001</hdrField3>
  </Hdr>
  <TxnBlock>
    <Txn>
        <txnField1>1644</txnField1>
        <txnField2>670</txnField2>
        <txnField3>00000001</txnField3>
    </Txn>
    <Txn>
    ...............
    </Txn>
    <Txn>
    ...............
    </Txn>
  </TxnBlock>
  <Trl>
    <trlField1>1644</trlField1>
    <trlField2>670</trlField2>
    <trlField3>00000001</trlField3>
  </Trl>
</File>

Я использую Jaxb2Marshaller

@StepScope
    public StaxEventItemReader<XmlVo> xmlReader()
            throws MalformedURLException {

        String fileName="011SBIN00200011924701.xml";
        StaxEventItemReader<XmlVo> reader = new StaxEventItemReader<>();
        reader.setResource(new FileSystemResource(fileName));
        reader.setFragmentRootElementNames(new String[] { "File","Hdr","Trl","Txn" });
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setClassesToBeBound(XmlVo.class,
                 HeaderVo.class,FooterVo.class,TxnVo.class);
        reader.setUnmarshaller(marshaller);

        return reader;
    }


@XmlRootElement(name = "File")
@XmlAccessorType(XmlAccessType.FIELD)
public class XmlVo {        

      @XmlElement(name="Hdr") 
      private HeaderVo Hdr;

      @XmlElement(name="Trl") 
      private FooterVo Trl;

      @XmlElement(name="TxnBlock") 
      private TxnBlockVo TxnBlock;

      /*@XmlElement(name="Txn") //
       private List<TxnVo> txn;*/


//getter setter
}

@XmlRootElement(name = "TxnBlock")
@XmlAccessorType(XmlAccessType.FIELD)
public class TxnBlockVo {

    @XmlElement(name="Txn") //
    private List<TxnVo> txn;

   //getter setter
}

Я могучитать данные из файла. Проблема в том, что я не получаю записи по частям. Размер моего чанка равен 5, и файл содержит почти 1000 фрагментов Txn, но весь файл читается как один.

Я пытался вставить List<TxnVo> в XmlVo.class. Но исключение nullpoint возникает в процессоре, когда я пытаюсь прочитать значение из списка Txn.

При чтении только фрагмента Txn обработка выполняется идеально. Но мне нужно также прочитать верхний и нижний колонтитулы.

Является ли моя обработка правильной? Как реализовать пакетную обработку в XML-файле с записями верхнего и нижнего колонтитула?

Заранее спасибо .?

1 Ответ

0 голосов
/ 07 ноября 2019

Это не то, как StaxEventItemReader предназначен для работы. Предполагается, что отдельный фрагмент XML (который может быть настолько сложным, насколько вы хотите) соответствует элементу. Вот выдержка из раздела Устройства чтения и записи элементов XML справочной документации:

предполагается, что ресурс XML представляет собой набор 'фрагментов', соответствующих отдельным записям

В вашем случае для каждой записи вы хотите отобразить элемент из заголовка (начало файла) + фрагмент (где-то в середине файла) + нижний колонтитул (конец файла)). Это требует, чтобы читатель переходил назад и вперед во входном файле, который не соответствует контракту считывателя элементов, для пересылки только, как объяснено в документах здесь :

Ожидается, что реализации интерфейса ItemReader являются только перенаправленными.

Так что в вашем случае вам необходимо обновить отображение, чтобы оно соответствовало ожидаемому StaxEventItemReader, или написать специальное средство чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...