Modul in diesem Artikel: Integration Flow Helper
XPath in SAP CPI aus einer Beispiel-Payload: XML und JSON zu XML
XPath für Content Modifier, Router, Filter und Splitter in SAP CPI aus einer Beispiel-Payload: XML-Pfade, Namespaces und JSON über das Root-Element des JSON to XML Converter.

Mit XPath liest SAP CPI einen Wert aus einer XML-Nachricht: eine Auftragsnummer in eine Property, einen Status in eine Router-Bedingung, einen wiederholten Knoten in einen Splitter. Am schnellsten schreiben Sie XPath korrekt, wenn Sie von einem echten Beispiel der Payload ausgehen, nicht von der Schnittstellenbeschreibung.
Dieser Artikel zeigt, wo XPath in einem iFlow verwendet wird, wie Sie Pfade aus einem XML-Beispiel ableiten, wie Namespaces funktionieren und wie JSON-Payloads zu XML werden – einschließlich der Frage, warum ihre Pfade mit /root beginnen.
Wo XPath in einem iFlow verwendet wird
- Content Modifier: Eine Header- oder Property-Zeile mit Quelltyp XPath liest einen Wert aus dem Body. Der Datentyp entscheidet, ob Sie Text erhalten, etwa
java.lang.String, oder Knoten. - Router und Filter: Bedingungen vom Typ XML sind XPath-Ausdrücke, zum Beispiel
/Orders/Order/Status = 'OPEN'. - Splitter: Der XPath-Ausdruck wählt den Knoten, der sich wiederholt – eine Nachricht pro Knoten.
- Gather, Aggregator und Content Enricher: XPath zeigt auf die Knoten, die zusammengeführt, korreliert oder angereichert werden.
Jeder dieser Schritte arbeitet auf dem Body, so wie er an dieser Stelle ist. Nach einem Mapping oder Converter ändern sich die Pfade mit der Struktur.
Vom XML-Beispiel zum XPath
Hier ein kleines Beispiel mit zwei Aufträgen:
<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 | Ergebnis auf dem Beispiel |
|---|---|
/Orders/Order/Id | Jede Auftrags-ID: 4711 und 4712 |
/Orders/Order[@status='OPEN']/Id | Die IDs offener Aufträge: 4711 |
/Orders/Order[1]/Customer/@id | Die Kunden-ID des ersten Auftrags: C-100 |
count(/Orders/Order) | Die Anzahl der Aufträge: 2 |
/Orders/Order[Amount > 1000] | Die Aufträge über 1000 |
Ein Pfad, der mit / beginnt, startet an der Wurzel; //Id findet Id-Elemente überall – bequem, aber bei großen Payloads langsamer.
Namespaces
Liegen die Elemente der Payload in einem Namespace, findet ein Pfad ohne Präfix nichts. Deklarieren Sie für jeden Namespace ein Präfix in der Runtime Configuration des iFlows unter Namespace Mapping, in der Form xmlns:ord=http://example.com/orders, und verwenden Sie es in jedem Schritt: /ord:Orders/ord:Order/ord:Id.
Das Präfix in Ihrem Mapping muss nicht dem in der Payload entsprechen; nur der Namespace-URI muss übereinstimmen. Ein XPath, der auf einer Payload, die Sie deutlich vor sich sehen, nichts liefert, deutet meist auf ein fehlendes Namespace Mapping hin.
JSON-Payloads: XPath über den JSON to XML Converter
XPath arbeitet auf XML, daher wird eine JSON-Nachricht zuerst mit dem JSON to XML Converter umgewandelt. Ein JSON-Objekt mit mehreren Membern hat kein einzelnes Root-Element, deshalb umschließt die Option Add XML Root Element des Converters es mit einem, standardmäßig root genannt. Die Pfade beginnen dann mit /root, und jedes Element eines Arrays wird zu einem wiederholten Element, das nach dem Array benannt ist:
{
"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-1Geben Sie der Wurzel im Converter einen anderen Namen, passen Sie den ersten Schritt jedes Pfads entsprechend an. Um nach den XPath-Schritten zu JSON zurückzukehren, verwenden Sie den XML to JSON Converter.
Warum ein XPath nichts zurückgibt
- Ein Namespace, der nicht unter Namespace Mapping deklariert ist, oder ein Pfad ohne sein Präfix.
- Falsche Groß-/Kleinschreibung: Element- und Attributnamen in XPath unterscheiden sie.
- Ein Pfad, der für die Payload geschrieben wurde, bevor ein Mapping oder Converter sie verändert hat.
- Ein JSON-Pfad ohne den Schritt
/rootoder mit dem Standardnamen, nachdem die Wurzel umbenannt wurde. - Der falsche Datentyp in einer Content-Modifier-Zeile:
java.lang.Stringliefert Text,org.w3c.dom.NodeListliefert Knoten.
Sie bauen die Werte anschließend in einen Body ein? Der Artikel über Simple Expressions zeigt, wie Sie die gerade gelesenen Properties verwenden, und der Artikel zu Postman und OpenAPI, wie Sie einen JSON-Body an eine REST-API senden.
Wie der Kitegra hilft
Die Browser-Erweiterung Kitegra schreibt die Pfade aus Ihrem Beispiel. Geben Sie ihr eine Beispiel-Payload in XML oder JSON, und sie schlägt XPath-Ausdrücke in XPath-Zeilen des Content Modifier sowie in Router, Filter, Splitter, Gather, Aggregator und Content Enricher vor. Bei einem JSON-Beispiel beginnen die vorgeschlagenen Pfade an der Wurzel des Converters, /root.
Beispiel-Payloads bleiben in Ihrem Browser: Kitegra speichert sie nie. Die Erweiterung speichert, deployt oder bearbeitet nie den Inhalt eines iFlows, und Ihr Tenant ändert sich nur, wenn Sie auf eine von vier benannten Aktionen klicken, die sich abschalten lassen.
Um den Body zu sehen, den ein XPath-Schritt wirklich erhält, tracen Sie die Nachricht Schritt für Schritt.
Ohne Kitegra-Konto funktioniert sie für 5 iFlows je Modul. Der Tarif Free umfasst 50, Starter 100 und Pro 300; Business hat kein Limit. Tarife vergleichen.
Probieren Sie ihn im nächsten iFlow aus
Lesen Sie, was der Kitegra im Designer der SAP Integration Suite leistet, oder sehen Sie ihn neben den anderen Chrome-Erweiterungen von Kitegra.
Häufige Fragen
Wie lese ich in SAP CPI einen Wert aus XML in eine Property?
Fügen Sie in einem Content Modifier eine Exchange-Property-Zeile mit Quelltyp XPath hinzu, mit dem Pfad als Quellwert, zum Beispiel /Orders/Order/Id, und java.lang.String als Datentyp.
Warum gibt mein XPath nichts zurück?
Die häufigsten Ursachen sind ein Namespace, der nicht unter Namespace Mapping deklariert ist, falsche Groß-/Kleinschreibung in einem Elementnamen oder ein Pfad, der für die Payload geschrieben wurde, bevor ein Mapping sie verändert hat.
Kann ich XPath auf eine JSON-Payload anwenden?
Nicht direkt. Wandeln Sie das JSON zuerst mit dem JSON to XML Converter um und schreiben Sie den XPath dann für das umgewandelte XML.
Warum beginnen XPaths für JSON mit /root?
Der JSON to XML Converter fügt standardmäßig ein Root-Element namens root hinzu, weil ein JSON-Objekt mit mehreren Membern keine einzelne Wurzel hat. Passen Sie die Pfade an, wenn Sie es umbenennen.
Wie sehen JSON-Arrays nach dem JSON to XML Converter aus?
Jedes Array-Element wird zu einem wiederholten Element, das nach dem Array benannt ist: Aus items mit zwei Einträgen werden zwei items-Elemente, gelesen mit /root/items.
Wie teile ich eine Nachricht mit XPath pro Auftrag auf?
Verwenden Sie einen Splitter mit dem XPath des wiederholten Knotens, zum Beispiel /Orders/Order. Jeder Auftrag wird zu einer eigenen Nachricht.