null

XPath и JsonPath в Apache NiFi

Продолжая статьи о работе с данными, нельзя не упомянуть такую небольшую, но важную тему как извлечение данных из XML и JSON документов с использованием языков выражений XPath и JsonPath. В прошлых статьях мы занимались трансформацией всего документа - реструктуризацией JSON или конвертацией JSON в XML и наоборот. Однако во многих ситуациях такие модификации не нужны и достаточно лишь извлечь из документов только конкретные определенные данные.

EvaluateXPath

XPath (XML Path Language) сам по себе - это язык запросов, используемый для поиска информации в XML-документах. С помощью набора выражений и операторов мы можем указать путь обхода нод XML-деревьев для вычленения искомой информации. Не будем перечислять все доступные функции и особенности синтаксиса, так как на просторах интернета подобных руководств достаточно. Для работы же с XPath в Apache NiFi используется процессор EvaluateXPath. Он применяет одно или несколько правил XPath к содержимому файла потока. В зависимости от конфигурации процессора результаты этих правил присваиваются атрибутам файла потока (flowfile-attribute в свойстве Destination) или записываются в содержимое самого файла (flowfile-content в свойстве Destination):

​​​​​​​

XPaths вводятся путем добавления пользовательских свойств (Property) через кнопку “плюс”; имя свойства должно соответствовать имени атрибута, в который будет помещен результат (если Destination - flowfile-attribute, в противном случае имя свойства игнорируется). В значение свойства (Value) собственно записывается выражение XPath. Таким образом на скриншоте выше мы добавляем к файлу потока атрибуты code и first-detail, в которые будут записаны значения, найденные в документе при помощи XPath выражений. В нашем случае это значения элемента Code и значение ноды Num внутри первого элемента Detail в списке Details. Return Type можно оставить как auto-detect и в атрибут запишется обычное строковое значение (в случае перезаписи всего файла тип будет nodeset).
После окончания обработки выражения файл потока может перейти по одному из отношений (relationships), среди которых failure (ошибка или неправильное выражение XPath), matched (удалось успешно выполнить XPath выражение) и unmatched (в документе не нашлось информации соответствующей запросу).

EvaluateJsonPath

С JsonPath все происходит абсолютно аналогичным образом. В NiFi используется процессор EvaluateJsonPath. Отличие заключается непосредственно в синтаксисе JsonPath (не будем подробно на нем останавливаться по тем же причинам, что и для XPath). Также у этого процессора есть свойства Path Not Found Behaviour и Null Value Representation. Первое определяет, создавать ли атрибут, если не удалось ничего найти по заданному выражению; второе - как представлять null значения (пустой строкой или null):

​​​​​​​

В нашем случае записался атрибут Number, содержащий значение одноименного поля внутри первого элемента списка ResultingObjects.