الانتقال إلى المحتوى
← العودة إلى المدونة

الوحدة في هذا المقال: Integration Flow Helper

XPath في SAP CPI انطلاقًا من نموذج حمولة: XML وJSON إلى XML

اكتب XPath لـ Content Modifier وRouter وFilter وSplitter في SAP CPI من نموذج حمولة: مسارات XML، ومساحات الأسماء، وJSON عبر العنصر الجذر في JSON to XML Converter.

XPath في SAP CPI انطلاقًا من نموذج حمولة: XML وJSON إلى XML

XPath هو الطريقة التي يقرأ بها SAP CPI قيمة من رسالة XML: رقم طلب إلى خاصية، وحالة إلى شرط Router، وعقدة متكررة إلى Splitter. وأسرع طريقة لكتابته بشكل صحيح هي البدء من نموذج حقيقي للحمولة، لا من وصف الواجهة.

يتناول هذا المقال مواضع استخدام XPath في الـ iFlow، وكيف تستخرج المسارات من نموذج XML، وكيف تعمل مساحات الأسماء (namespaces)، وكيف تتحول حمولات JSON إلى XML، بما في ذلك سبب بدء مساراتها بـ /root.

أين يُستخدم XPath في الـ iFlow

  • Content Modifier: صف ترويسة أو خاصية بنوع المصدر XPath يقرأ قيمة من جسم الرسالة. ونوع البيانات يحدد هل تحصل على نص، مثل java.lang.String، أم على عُقد.
  • Router وFilter: الشروط من النوع XML هي تعبيرات XPath، مثل /Orders/Order/Status = 'OPEN'.
  • Splitter: يحدد تعبير XPath العقدة المتكررة، فتنتج رسالة لكل عقدة.
  • Gather وAggregator وContent Enricher: يشير XPath إلى العُقد المراد دمجها أو ربطها أو إثراؤها.

كل هذه الخطوات تعمل على جسم الرسالة كما هو عند تلك الخطوة. وبعد التحويل (mapping) أو المحوّل، تتغير المسارات بتغير البنية.

من نموذج 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كل معرّفات الطلبات: 4711 و4712
/Orders/Order[@status='OPEN']/Idمعرّفات الطلبات المفتوحة: 4711
/Orders/Order[1]/Customer/@idمعرّف العميل في الطلب الأول: C-100
count(/Orders/Order)عدد الطلبات: 2
/Orders/Order[Amount > 1000]الطلبات التي تتجاوز 1000

المسار الذي يبدأ بـ / يبدأ من الجذر؛ أما //Id فيجد عناصر Id في أي موضع، وهذا مريح لكنه أبطأ مع الحمولات الكبيرة.

مساحات الأسماء (Namespaces)

إذا كانت عناصر الحمولة ضمن مساحة أسماء، فإن المسار الخالي من البادئة لا يجد شيئًا. عرّف بادئة لكل مساحة أسماء في Runtime Configuration للـ iFlow تحت Namespace Mapping، بالصيغة xmlns:ord=http://example.com/orders، واستخدمها في كل خطوة: /ord:Orders/ord:Order/ord:Id.

لا يلزم أن تطابق البادئة في التعريف البادئة الموجودة في الحمولة؛ المهم أن يطابق URI مساحة الأسماء. وتعبير XPath الذي لا يُرجع شيئًا على حمولة تراها بوضوح سببه في الغالب تعريف مساحة أسماء مفقود.

حمولات 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 Mapping، أو مسار دون بادئته.
  • حالة أحرف خاطئة: أسماء العناصر والسمات في XPath تميّز بين الأحرف الكبيرة والصغيرة.
  • مسار كُتب للحمولة قبل أن يغيّرها تحويل (mapping) أو محوّل.
  • مسار JSON دون الخطوة /root، أو بالاسم الافتراضي بعد إعادة تسمية الجذر.
  • نوع بيانات خاطئ في صف Content Modifier: ‏java.lang.String يُرجع نصًا، وorg.w3c.dom.NodeList يُرجع عُقدًا.

ستبني القيم في جسم رسالة بعد ذلك؟ يبيّن مقال تعبيرات Simple كيف تستخدم الخصائص التي قرأتها للتو، ويبيّن مقال Postman وOpenAPI كيف ترسل جسم JSON إلى REST API.

كيف يساعدك Kitegra

تكتب إضافة المتصفح Kitegra المسارات انطلاقًا من نموذجك. أعطها نموذج حمولة بصيغة XML أو JSON، فتقترح تعبيرات XPath في صفوف XPath في Content Modifier، وفي Router وFilter وSplitter وGather وAggregator وContent Enricher. ولنموذج JSON، تبدأ المسارات المقترحة من جذر المحوّل، /root.

تبقى نماذج الحمولة في متصفحك: لا يخزّنها Kitegra أبدًا. ولا تحفظ الإضافة محتوى أي iFlow ولا تنشره ولا تعدّله أبدًا، ولا يتغير المستأجر إلا عندما تنقر أحد أربعة إجراءات محددة بالاسم يمكن إيقافها.

لترى الجسم الذي تستلمه خطوة XPath فعلًا، تتبّع الرسالة خطوة بخطوة.

بلا حساب تعمل الإضافة على 5 iFlows لكل وحدة. وتغطي خطة Free حتى 50، وخطة Starter حتى 100، وخطة Pro حتى 300، أما خطة Business فبلا حد. قارن بين الخطط.

جرّبها في الـ iFlow التالي

تعرّف على ما يفعله Kitegra في مصمم SAP Integration Suite، أو اطّلع عليه مع بقية وحدات Kitegra.

الأسئلة الشائعة

كيف أقرأ قيمة من XML إلى خاصية في SAP CPI؟

في Content Modifier، أضف صف خاصية تبادل بنوع المصدر XPath، مع المسار كقيمة للمصدر، مثل /Orders/Order/Id، وjava.lang.String كنوع للبيانات.

لماذا لا يُرجع XPath الذي كتبته شيئًا؟

أكثر الأسباب شيوعًا: مساحة أسماء غير معرّفة تحت Namespace Mapping، أو حالة أحرف خاطئة في اسم عنصر، أو مسار كُتب للحمولة قبل أن يغيّرها تحويل (mapping).

هل يمكنني استخدام XPath على حمولة 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. فيصبح كل طلب رسالة مستقلة.

اعمل على الـ iFlows دون مغادرة المصمم

أضِف Kitegra إلى Chrome أو Microsoft Edge. ابدأ مجانًا دون الحاجة إلى حساب.