Модуль в этой статье: 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 читает значение из 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']/Id | ID открытых заказов: 4711 |
/Orders/Order[1]/Customer/@id | ID клиента первого заказа: 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. Каждый заказ станет отдельным сообщением.