İçeriğe geç
← Bloga dön

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.

Örnek yükten SAP CPI XPath: XML ve JSON'dan XML'e

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.String gibi 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/IdTüm sipariş kimlikleri: 4711 ve 4712
/Orders/Order[@status='OPEN']/IdAçı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-1

Dö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.
  • /root adı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.String metin, org.w3c.dom.NodeList düğü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.

Tasarımcıdan ayrılmadan iFlow'lar üzerinde çalışın

Kitegra'i Chrome'a veya Microsoft Edge'e ekleyin. Ücretsiz başlayın, hesap gerekmez.