Modulo di questo articolo: Integration Flow Helper
XPath in SAP CPI da un payload di esempio: XML e JSON in XML
Scrivi XPath per Content Modifier, Router, Filter e Splitter di SAP CPI da un payload di esempio: percorsi XML, namespace e JSON tramite l'elemento radice del JSON to XML Converter.

XPath è il modo in cui SAP CPI legge un valore da un messaggio XML: un numero d'ordine in una proprietà, uno stato in una condizione del Router, un nodo ripetuto in uno Splitter. Il modo più rapido per scriverlo correttamente è partire da un campione reale del payload, non dalla descrizione dell'interfaccia.
Questo articolo spiega dove si usa XPath in un iFlow, come ricavare i percorsi da un campione XML, come funzionano i namespace e come i payload JSON diventano XML, compreso il motivo per cui i loro percorsi iniziano con /root.
Dove si usa XPath in un iFlow
- Content Modifier: una riga di header o di proprietà con tipo di origine XPath legge un valore dal body. Il tipo di dato decide se ottieni testo, come
java.lang.String, o nodi. - Router e Filter: le condizioni di tipo XML sono espressioni XPath, per esempio
/Orders/Order/Status = 'OPEN'. - Splitter: l'espressione XPath seleziona il nodo che si ripete, un messaggio per nodo.
- Gather, Aggregator e Content Enricher: XPath indica i nodi da combinare, correlare o arricchire.
Ognuno di questi lavora sul body così com'è in quello step. Dopo un mapping o un converter, i percorsi cambiano insieme alla struttura.
Da un campione XML a un XPath
Ecco un piccolo campione con due ordini:
<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 | Risultato sul campione |
|---|---|
/Orders/Order/Id | Tutti gli ID d'ordine: 4711 e 4712 |
/Orders/Order[@status='OPEN']/Id | Gli ID degli ordini aperti: 4711 |
/Orders/Order[1]/Customer/@id | L'ID cliente del primo ordine: C-100 |
count(/Orders/Order) | Il numero di ordini: 2 |
/Orders/Order[Amount > 1000] | Gli ordini sopra 1000 |
Un percorso che inizia con / parte dalla radice; //Id trova elementi Id ovunque, il che è comodo ma più lento su payload grandi.
Namespace
Se gli elementi del payload sono in un namespace, un percorso senza prefisso non trova nulla. Dichiara un prefisso per ogni namespace nella Runtime Configuration dell'iFlow, in Namespace Mapping, nella forma xmlns:ord=http://example.com/orders, e usalo in ogni step del percorso: /ord:Orders/ord:Order/ord:Id.
Il prefisso nel tuo mapping non deve per forza coincidere con quello del payload; deve coincidere solo l'URI del namespace. Un XPath che non restituisce nulla su un payload che vedi chiaramente di solito dipende da un Namespace Mapping mancante.
Payload JSON: XPath tramite il JSON to XML Converter
XPath lavora su XML, quindi un messaggio JSON va prima convertito con il JSON to XML Converter. Un oggetto JSON con più membri non ha un unico elemento radice, perciò l'opzione Add XML Root Element del converter lo avvolge in uno, chiamato root per default. I percorsi iniziano quindi con /root, e ogni elemento di un array diventa un elemento ripetuto con il nome dell'array:
{
"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-1Se nel converter dai un altro nome alla radice, cambia di conseguenza il primo step di ogni percorso. Per tornare a JSON dopo gli step con XPath, usa l'XML to JSON Converter.
Perché un XPath non restituisce nulla
- Un namespace non dichiarato in Namespace Mapping, o un percorso senza il suo prefisso.
- Maiuscole e minuscole sbagliate: in XPath i nomi di elementi e attributi le distinguono.
- Un percorso scritto per il payload prima che un mapping o un converter lo cambiasse.
- Un percorso JSON senza lo step
/root, o con il nome di default dopo che la radice è stata rinominata. - Il tipo di dato sbagliato in una riga di Content Modifier:
java.lang.Stringrestituisce testo,org.w3c.dom.NodeListrestituisce nodi.
Poi devi costruire un body con quei valori? L'articolo sulle espressioni Simple mostra come usare le proprietà appena lette, e l'articolo su Postman e OpenAPI mostra come inviare un body JSON a un'API REST.
Come aiuta Kitegra
L'estensione del browser Kitegra scrive i percorsi a partire dal tuo campione. Forniscile un payload di esempio in XML o JSON e ti suggerisce espressioni XPath nelle righe XPath del Content Modifier, in Router, Filter, Splitter, Gather, Aggregator e Content Enricher. Per un campione JSON, i percorsi suggeriti partono dalla radice del converter, /root.
I payload di esempio restano nel tuo browser: Kitegra non li salva mai. L'estensione non salva, non esegue il deploy e non modifica mai il contenuto di un iFlow, e il tuo tenant cambia solo quando fai clic su una di quattro azioni ben precise, che si possono disattivare.
Per vedere il body che uno step XPath riceve davvero, traccia il messaggio step by step.
Senza un account Kitegra funziona su 5 iFlow per modulo. Il piano Free ne copre 50, Starter 100 e Pro 300; Business non ha limiti. Confronta i piani.
Provalo nel tuo prossimo iFlow
Scopri cosa fa Kitegra nel designer di SAP Integration Suite, oppure guardalo accanto alle altre estensioni Chrome di Kitegra.
Domande frequenti
Come leggo un valore da un XML in una proprietà in SAP CPI?
In un Content Modifier, aggiungi una riga di exchange property con tipo di origine XPath, il percorso come valore di origine, per esempio /Orders/Order/Id, e java.lang.String come tipo di dato.
Perché il mio XPath non restituisce nulla?
Le cause più comuni sono un namespace non dichiarato in Namespace Mapping, maiuscole e minuscole sbagliate nel nome di un elemento, o un percorso scritto per il payload prima che un mapping lo cambiasse.
Posso usare XPath su un payload JSON?
Non direttamente. Converti prima il JSON con il JSON to XML Converter, poi scrivi l'XPath sull'XML convertito.
Perché gli XPath per JSON iniziano con /root?
Il JSON to XML Converter aggiunge per default un elemento radice chiamato root, perché un oggetto JSON con più membri non ha un'unica radice. Cambia i percorsi se lo rinomini.
Come appaiono gli array JSON dopo il JSON to XML Converter?
Ogni elemento dell'array diventa un elemento ripetuto con il nome dell'array, quindi items con due voci diventa due elementi items, letti con /root/items.
Come divido un messaggio per ordine con XPath?
Usa uno Splitter con l'XPath del nodo che si ripete, per esempio /Orders/Order. Ogni ordine diventa un messaggio a sé.