Перейти к содержимому
Kitegra
← Вернуться в блог

Модуль в этой статье: Integration Flow Helper

XPath в SAP CPI по примеру payload: XML и JSON в XML

XPath для Content Modifier, Router, Filter и Splitter в SAP CPI по примеру payload: пути XML, namespaces и JSON через корневой элемент JSON to XML Converter.

XPath в SAP CPI по примеру payload: XML и JSON в XML

XPath — это способ, которым SAP CPI читает значение из XML-сообщения: номер заказа для свойства, статус для условия Router, повторяющийся узел для Splitter. Быстрее всего написать его правильно, если начать с реального образца payload, а не с описания интерфейса.

В этой статье разобрано, где в iFlow используется XPath, как вывести пути из образца XML, как работают namespaces и как payload в JSON превращается в XML — включая то, почему его пути начинаются с /root.

Где в iFlow используется XPath

  • Content Modifier: строка header или свойства с типом источника XPath читает значение из тела. Тип данных определяет, получите ли вы текст, например java.lang.String, или узлы.
  • Router и Filter: условия типа XML — это выражения XPath, например /Orders/Order/Status = 'OPEN'.
  • Splitter: выражение XPath выбирает повторяющийся узел, одно сообщение на узел.
  • Gather, Aggregator и Content Enricher: XPath указывает на узлы, которые объединяются, сопоставляются или обогащаются.

Все они работают с телом в том виде, в каком оно находится на этом шаге. После маппинга или конвертера пути меняются вместе со структурой.

От образца XML к XPath

Вот небольшой образец с двумя заказами:

<Orders>
  <Order status="OPEN">
    <Id>4711</Id>
    <Customer id="C-100">ACME</Customer>
    <Amount currency="EUR">1250.00</Amount>
  </Order>
  <Order status="CLOSED">
    <Id>4712</Id>
    <Customer id="C-200">Globex</Customer>
    <Amount currency="EUR">80.00</Amount>
  </Order>
</Orders>
XPathРезультат на образце
/Orders/Order/IdВсе ID заказов: 4711 и 4712
/Orders/Order[@status='OPEN']/IdID открытых заказов: 4711
/Orders/Order[1]/Customer/@idID клиента первого заказа: C-100
count(/Orders/Order)Количество заказов: 2
/Orders/Order[Amount > 1000]Заказы на сумму больше 1000

Путь, начинающийся с /, идёт от корня; //Id находит элементы Id где угодно — это удобно, но медленнее на больших payload.

Namespaces

Если элементы payload находятся в namespace, путь без префикса ничего не найдёт. Объявите префикс для каждого namespace в Runtime Configuration iFlow, в Namespace Mapping, в виде xmlns:ord=http://example.com/orders, и используйте его на каждом шаге: /ord:Orders/ord:Order/ord:Id.

Префикс в вашем сопоставлении не обязан совпадать с префиксом в payload; совпадать должен только URI namespace. Если XPath ничего не возвращает на payload, который вы ясно видите, причина обычно в отсутствующем Namespace Mapping.

Payload в JSON: XPath через JSON to XML Converter

XPath работает с XML, поэтому JSON-сообщение сначала преобразуется через JSON to XML Converter. У JSON-объекта с несколькими членами нет единственного корневого элемента, поэтому опция конвертера Add XML Root Element оборачивает его в такой элемент, по умолчанию с именем root. Тогда пути начинаются с /root, а каждый элемент массива становится повторяющимся элементом с именем массива:

{
  "orderId": "4711",
  "customer": { "id": "C-100", "name": "ACME" },
  "items": [
    { "sku": "A-1", "qty": 2 },
    { "sku": "B-7", "qty": 1 }
  ]
}

JSON to XML Converter (root element: root)

<root>
  <orderId>4711</orderId>
  <customer><id>C-100</id><name>ACME</name></customer>
  <items><sku>A-1</sku><qty>2</qty></items>
  <items><sku>B-7</sku><qty>1</qty></items>
</root>

/root/orderId              4711
/root/customer/name        ACME
/root/items/sku            A-1, B-7
/root/items[qty > 1]/sku   A-1

Если в конвертере вы дадите корню другое имя, измените первый шаг каждого пути соответственно. Чтобы вернуться к JSON после шагов с XPath, используйте XML to JSON Converter.

Почему XPath ничего не возвращает

  • Namespace не объявлен в Namespace Mapping, или в пути нет его префикса.
  • Неверный регистр: в XPath имена элементов и атрибутов чувствительны к регистру.
  • Путь написан для payload в том виде, каким он был до того, как его изменил маппинг или конвертер.
  • Путь для JSON без шага /root или с именем по умолчанию после переименования корня.
  • Неверный тип данных в строке Content Modifier: java.lang.String возвращает текст, org.w3c.dom.NodeList — узлы.

Собираетесь потом построить из этих значений тело? В статье о выражениях Simple показано, как использовать только что прочитанные свойства, а в статье о Postman и OpenAPI — как отправить тело JSON в REST API.

Чем помогает Kitegra

Расширение браузера Kitegra пишет пути по вашему образцу. Передайте ему пример payload в XML или JSON, и оно будет подсказывать выражения XPath в строках XPath Content Modifier, Router, Filter, Splitter, Gather, Aggregator и Content Enricher. Для образца JSON подсказанные пути начинаются с корня конвертера, /root.

Примеры payload остаются в вашем браузере: Kitegra никогда их не сохраняет. Расширение никогда не сохраняет, не развёртывает и не редактирует содержимое iFlow, а ваш tenant меняется только тогда, когда вы нажимаете одно из четырёх названных действий, и их можно отключить.

Чтобы увидеть тело, которое на самом деле получает шаг с XPath, трассируйте сообщение шаг за шагом.

Без аккаунта Kitegra расширение работает на 5 iFlow в каждом модуле. Тариф Free охватывает 50, Starter — 100, Pro — 300; в Business ограничений нет. Сравните тарифы.

Попробуйте в следующем iFlow

Узнайте, что делает Kitegra в дизайнере SAP Integration Suite, или посмотрите его рядом с другими расширениями Kitegra для Chrome.

Частые вопросы

Как прочитать значение из XML в свойство в SAP CPI?

В Content Modifier добавьте строку exchange property с типом источника XPath, путём в качестве значения источника, например /Orders/Order/Id, и типом данных java.lang.String.

Почему мой XPath ничего не возвращает?

Чаще всего причина в namespace, не объявленном в Namespace Mapping, в неверном регистре имени элемента или в пути, написанном для payload до того, как его изменил маппинг.

Можно ли использовать XPath для payload в JSON?

Не напрямую. Сначала преобразуйте JSON через JSON to XML Converter, а затем пишите XPath для полученного XML.

Почему XPath для JSON начинаются с /root?

JSON to XML Converter по умолчанию добавляет корневой элемент с именем root, потому что у JSON-объекта с несколькими членами нет единственного корня. Если переименуете его, измените пути.

Как выглядят массивы JSON после JSON to XML Converter?

Каждый элемент массива становится повторяющимся элементом с именем массива, поэтому items с двумя записями превращается в два элемента items, которые читаются через /root/items.

Как разделить сообщение по заказам с помощью XPath?

Используйте Splitter с XPath повторяющегося узла, например /Orders/Order. Каждый заказ станет отдельным сообщением.

Работайте с iFlows, не покидая дизайнер

Добавьте Kitegra в Chrome или Microsoft Edge. Начните бесплатно, без аккаунта.