Как обработать весь XML, а затем вернуть фрагменты - PullRequest
0 голосов
/ 29 октября 2018

У меня есть xml вроде следующего для обработки etl

<?xml version="1.0"?>
<OMeS  version="2.3"   adapId="nokrww"  xmlns="pm/cnf_rnc_nsn.7.0.xsd">
  <PMSetup  startTime="2018-10-23T11:00:00.000+05:00:00" interval="15">
    <PMMOResult>
      <MO dimension="network_element">
        <DN><![CDATA[PLMN-PLMN/RNC-3/WBTS-500/WCEL-1]]></DN>
      </MO>
      <MO dimension="MCCMNC">
        <DN><![CDATA[PLMN-PLMN/MCC-4/MNC-5]]></DN>
      </MO>
      <PMTarget  measurementType="L3Iub">
        <M1005C0>424</M1005C0>
        <M1005C1>858</M1005C1>
    </PMMOResult>
    <PMMOResult>
      <MO dimension="network_element">
        <DN><![CDATA[PLMN-PLMN/RNC-3/WBTS-501/WCEL-2]]></DN>
      </MO>
      <MO dimension="MCCMNC">
        <DN><![CDATA[PLMN-PLMN/MCC-5/MNC-6]]></DN>
      </MO>
      <PMTarget  measurementType="L3Iub">
        <M1005C0>201</M1005C0>
        <M1005C1>300</M1005C1>
    </PMMOResult>
</PMSetup>
</OMeS>

Если я использую PMMOResult для фрагментаRootElementName, я не могу получить доступ к атрибуту startTime.

Если я использую OM * в качестве фрагмента RootElementName, у меня есть только один элемент для записи

Как я могу переопределить StaxEventItemReader для чтения всего документа с использованием OMeS в качестве fragreoTelementName, а затем доступа ко всем вложенным элементам в тегах PMMOResult, внесения некоторых изменений и возврата в виде списка?

1 Ответ

0 голосов
/ 29 октября 2018

Это невозможно. StaxEventItemReader может читать только один тип за раз (из базового контракта считывателя предметов: ItemReader<T>). Установка fragmentRootElementName в PMSetup для получения атрибута startTime возможна, но в итоге вы получите один огромный элемент PMSetup в памяти со всеми дочерними элементами PMMOResult, что не является тем, что вам нужно.

Поэтому я бы рекомендовал перейти в два этапа:

  • шаг 1: используйте тасклет, чтобы получить любые метаданные, необходимые из элементов заголовка (и при необходимости передать его шагу 2 через контекст выполнения шага)
  • шаг 2: используйте ориентированный на чанки тасклет для обработки PMMOResult элементов в чанках, установив fragmentRootElementName в PMMOResult в StaxEventItemReader

Надеюсь, это поможет.

...