Bu makaledeki modül: Integration Flow Helper
Örnek yükten SAP CPI XPath: XML ve JSON'dan XML'e
Örnek bir yükten SAP CPI Content Modifier, Router, Filter ve Splitter için XPath yazın: XML yolları, namespace'ler ve JSON to XML Converter'ın kök öğesi üzerinden JSON.

XPath, SAP CPI'ın bir XML mesajından değer okuma yoludur: bir özellik için sipariş numarası, bir Router koşulu için durum, bir Splitter için tekrar eden düğüm. Onu doğru yazmanın en hızlı yolu, arayüz açıklamasından değil, yükün (payload) gerçek bir örneğinden başlamaktır.
Bu makale bir iFlow'da XPath'in nerelerde kullanıldığını, bir XML örneğinden yolların nasıl çıkarıldığını, namespace'lerin nasıl çalıştığını ve JSON yüklerinin nasıl XML'e dönüştüğünü, yollarının neden /root ile başladığı da dahil olmak üzere ele alıyor.
Bir iFlow'da XPath'in kullanıldığı yerler
- Content Modifier: XPath kaynak türüne sahip bir header veya özellik satırı gövdeden bir değer okur. Veri türü,
java.lang.Stringgibi metin mi yoksa düğümler mi alacağınızı belirler. - Router ve Filter: XML türündeki koşullar XPath ifadeleridir, örneğin
/Orders/Order/Status = 'OPEN'. - Splitter: XPath ifadesi tekrar eden düğümü seçer; her düğüm için bir mesaj.
- Gather, Aggregator ve Content Enricher: XPath birleştirilecek, eşleştirilecek veya zenginleştirilecek düğümleri gösterir.
Hepsi gövde üzerinde, o adımdaki haliyle çalışır. Bir eşleme veya dönüştürücüden sonra yollar yapıyla birlikte değişir.
Bir XML örneğinden XPath'e
İşte iki sipariş içeren küçük bir örnek:
<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 | Örnek üzerindeki sonuç |
|---|---|
/Orders/Order/Id | Tüm sipariş kimlikleri: 4711 ve 4712 |
/Orders/Order[@status='OPEN']/Id | Açık siparişlerin kimlikleri: 4711 |
/Orders/Order[1]/Customer/@id | İlk siparişin müşteri kimliği: C-100 |
count(/Orders/Order) | Sipariş sayısı: 2 |
/Orders/Order[Amount > 1000] | 1000'in üzerindeki siparişler |
/ ile başlayan bir yol kökten başlar; //Id ise Id öğelerini her yerde bulur. Bu kullanışlıdır ama büyük yüklerde daha yavaştır.
Namespace'ler
Yükteki öğeler bir namespace içindeyse, öneksiz bir yol hiçbir şey bulmaz. iFlow'un Runtime Configuration bölümündeki Namespace Mapping alanında her namespace için xmlns:ord=http://example.com/orders biçiminde bir önek tanımlayın ve her adımda kullanın: /ord:Orders/ord:Order/ord:Id.
Eşlemenizdeki önekin yüktekiyle aynı olması gerekmez; yalnızca namespace URI'si eşleşmelidir. Açıkça gördüğünüz bir yük üzerinde hiçbir şey döndürmeyen bir XPath, genellikle eksik bir Namespace Mapping'den kaynaklanır.
JSON yükleri: JSON to XML Converter üzerinden XPath
XPath XML üzerinde çalışır; bu yüzden bir JSON mesajı önce JSON to XML Converter ile dönüştürülür. Birden fazla üyesi olan bir JSON nesnesinin tek bir kök öğesi yoktur; bu nedenle dönüştürücünün Add XML Root Element seçeneği onu varsayılan olarak root adlı bir öğeyle sarar. Yollar bu durumda /root ile başlar ve bir dizinin her elemanı, dizinin adını taşıyan tekrar eden bir öğeye dönüşür:
{
"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-1Dönüştürücüde köke farklı bir ad verirseniz, her yolun ilk adımını buna göre değiştirin. XPath adımlarından sonra JSON'a dönmek için XML to JSON Converter kullanın.
Bir XPath neden hiçbir şey döndürmez
- Namespace Mapping içinde tanımlanmamış bir namespace veya öneki olmayan bir yol.
- Yanlış büyük/küçük harf: XPath'te öğe ve öznitelik adları büyük/küçük harfe duyarlıdır.
- Bir eşleme veya dönüştürücü yükü değiştirmeden önceki hali için yazılmış bir yol.
/rootadımı olmayan ya da kök yeniden adlandırıldıktan sonra varsayılan adı kullanan bir JSON yolu.- Bir Content Modifier satırında yanlış veri türü:
java.lang.Stringmetin,org.w3c.dom.NodeListdüğümler döndürür.
Sonra bu değerlerden bir gövde mi oluşturacaksınız? Simple ifadeleri makalesi az önce okuduğunuz özelliklerin nasıl kullanılacağını, Postman ve OpenAPI makalesi ise bir REST API'ye JSON gövdesinin nasıl gönderileceğini gösterir.
Kitegra nasıl yardımcı olur
Kitegra tarayıcı uzantısı yolları örneğinizden yazar. Ona XML veya JSON biçiminde örnek bir yük verin; Content Modifier'ın XPath satırlarında ve Router, Filter, Splitter, Gather, Aggregator ile Content Enricher'da XPath ifadeleri önerir. Bir JSON örneği için önerilen yollar dönüştürücünün kökü olan /root ile başlar.
Örnek yükler tarayıcınızda kalır: Kitegra onları asla saklamaz. Uzantı bir iFlow'un içeriğini asla kaydetmez, dağıtmaz veya düzenlemez; tenant'ınız yalnızca, kapatılabilen ve adı belli dört işlemden birine tıkladığınızda değişir.
Bir XPath adımının gerçekte aldığı gövdeyi görmek için mesajı adım adım trace edin.
Kitegra hesabı olmadan modül başına 5 iFlow'da çalışır. Free planı 50, Starter 100 ve Pro 300 iFlow'u kapsar; Business'ta sınır yoktur. Planları karşılaştırın.
Bir sonraki iFlow'unuzda deneyin
Kitegra'ın SAP Integration Suite tasarımcısında neler yaptığını okuyun veya onu Kitegra'in diğer Chrome uzantılarıyla birlikte görün.
Sık sorulan sorular
SAP CPI'da bir XML'deki değeri bir özelliğe nasıl okurum?
Bir Content Modifier'da XPath kaynak türüne sahip bir exchange property satırı ekleyin; kaynak değeri olarak yolu, örneğin /Orders/Order/Id, veri türü olarak da java.lang.String girin.
XPath'im neden hiçbir şey döndürmüyor?
En yaygın nedenler Namespace Mapping içinde tanımlanmamış bir namespace, bir öğe adında yanlış büyük/küçük harf ya da bir eşleme yükü değiştirmeden önceki hali için yazılmış bir yoldur.
Bir JSON yükü üzerinde XPath kullanabilir miyim?
Doğrudan değil. Önce JSON'u JSON to XML Converter ile dönüştürün, ardından XPath'i dönüştürülmüş XML üzerine yazın.
JSON için XPath'ler neden /root ile başlıyor?
JSON to XML Converter varsayılan olarak root adlı bir kök öğe ekler, çünkü birden fazla üyesi olan bir JSON nesnesinin tek bir kökü yoktur. Ona başka bir ad verirseniz yolları değiştirin.
JSON to XML Converter'dan sonra JSON dizileri nasıl görünür?
Dizinin her elemanı, dizinin adını taşıyan tekrar eden bir öğeye dönüşür; bu yüzden iki girdili items, /root/items ile okunan iki items öğesine dönüşür.
Bir mesajı XPath ile siparişlere nasıl bölerim?
Tekrar eden düğümün XPath'iyle, örneğin /Orders/Order, bir Splitter kullanın. Her sipariş ayrı bir mesaja dönüşür.