Разобрать XML и заменить значения из другого источника данных - PullRequest
0 голосов
/ 19 февраля 2019

У меня много XML с размером <= 256 КБ, имеющим структуру ниже </p>

<node>
    <id>XXX</id>
    <value1></value1>
    <value2></value2>
    <value3></value3>
    <value4></value4>
</node>

Теперь у меня есть требование, что мне нужно использовать id в качестве XXX для получения данных из API Rest и APIвернет список данных.Мне нужно отобразить список возвращенных данных в поля 'value1', 'value2', ...

API curl http://example.com/api/getById/XXX возвращаемое значение1 = V1, value2 = V2, value3 = V3, value4= V4

Вывод будет

<node>
    <id>XXX</id>
    <value1>V1</value1>
    <value2>V2</value2>
    <value3>V3</value3>
    <value4>V4</value4>
</node>

Мы хотели бы использовать технологии, связанные с Java, чтобы выполнить требование.

Пока что я думаю о паре ниже опций

  1. Загрузить XML как Java POJO, а затем написать чистую Java-логику с логикой if else для вызова REST API, а затем обновить POJO и выполнить обратную запись в XML.

  2. Загрузите XML как xpath и добавьте логику сопоставления в конфигурацию

Я также думаю о таких опциях, как использование верблюда или весенней партии.

Пожалуйста, посоветуйте, если у вас естьопыт одинаковый с достоинствами и недостатками.Или, если у вас другой подход, поделитесь.

1 Ответ

0 голосов
/ 19 февраля 2019

Для этой работы вы можете использовать Kiba ETL (отказ от ответственности: я автор), инфраструктура ETL, которая работает с обоими JRuby (Ruby на JVM - что позволяет вам использовать любыеКомпонент Java, если хотите) или "обычный" Ruby.

Как правило, это будет выглядеть следующим образом:

source Kiba::Common::Sources::Enumerable, -> { Dir["input/*.xml"] }

# read each file
transform { |r| IO.binread(r) }

# parse as XML document
transform { |r| Nokogiri::XML(r) }

# this will return an array of XML elements
transform { |r| r.search('/the-root/node') }

# this will explode the array (one order per output row)
transform Kiba::Common::Transforms::EnumerableExploder

# now achieve look-up via REST API
transform do |r|
  the_id = r.at('id').text()
  # achieve your HTTP rest query here then remap, e.g.:
  response = HTTParty.get('http://example.com', query: { the_id: the_id })
  # ... more processing
  r.merge(... your response extracted fields ...)
end

Парсинг в памяти будет хорошо работать для размера файлов, которые у вас есть.Если вам придется обрабатывать файлы гораздо больших размеров, вы можете переключиться на синтаксический анализ SAX.

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

...