NiFi ReplaceText: убрать все теги xml между определенными тегами - PullRequest
0 голосов
/ 08 марта 2019

У меня есть XML-документ ниже. Я хочу вырезать все теги между <TXT> и </TXT>, чтобы создать текстовый тег в NiFi, чтобы текст читался как предложение. Я попробовал следующий шаблон регулярных выражений в процессоре ReplaceText в NiFi, но процесс не удался - даже при том, что он захватил полный текстовый раздел на regex101.com. Что я сделал не так?

Клиент предпочел бы использовать для этого встроенные процессоры NiFi, а не реализовывать сценарий.

Regex

<TXT.*>((.|\n)*?)<\/TXT>$

XML

<DOC>
<ID>12345</ID>
<TXT>
    <A><DESC type="PERSON">George Washington</DESC> lived in a house called <DESC type="PLACE">Mount Vernon</DESC></A>
</TXT>
</DOC>

конфигурации ReplaceText следующие

Search Value: <TXT.*>((.|\n)*?)<\/TXT>$
Replacement Value: <RAW>$1</RAW>
Character Set: UTF-8
Maximum Buffer Size: 1 MB
Replacement Strategy: Regex Replace
Evaluation Mode: Entire text

Идеальный вывод

<DOC>
<ID>12345</ID>
<RAW>George Washington lived in a house called Mount Vernon</RAW>
</DOC>

1 Ответ

0 голосов
/ 12 марта 2019

Во-первых, отказ от ответственности:

  • Преобразование XSLT может быть тем, что вы хотите
  • Сценарий может быть тем, что вы хотите

Насколько мне известно, вы не можете выполнять рекурсивное регулярное выражение в NiFi. Таким образом, вам нужно будет связать процессоры:

  • Один процессор для замены <TXT>([\S\s]*?)<\/TXT> на <RAW>$1</RAW>
  • Один процессор для маршрутизации контента на <RAW>[\S|\s]*?<[\S|\s]*?</RAW> (если RAW содержит внутренний тег)
    • Если не имеет себе равных, вы хороши
    • Если он совпадает, удалите первый тег, используя другой replaceText (<RAW>[\S\s]*?)(<[\S\s]*?>)([\S\s]*?</RAW>)

Это действительно кажется излишним, и, поскольку ваш текст аннотирован, вполне вероятно, что ваш клиент уже где-то использует Python и не должен бояться сценариев.

...