الـXML لم يُقتل (بلا أمل) — احوله إلى JSON مثل البالغين
كنت تعتقد أنك فرحت من XML. كنت خاطئًا. إليك كيفية التعامل مع XML من واجهات برمجة قديمة ونظم تجارية، وفهم الميزات الهيكلية، وتحويلها إلى JSON دون أن تفقد عقلك.
تعلمت REST. احتضنت JSON. فكرت أن العصر XML انتهى، مثل Flash أو IE6 — شيء تُخبره المطورين الشباب به كقصة في حديقة النار. ثم أعطى لك العميل الجديد بيانات واجهة برمجة للتكامل مع بنك، وظهر أمامك: علبة SOAP بطول 400 سطر.
مرحباً بك مرة أخرى في XML. لم يغادر أبداً.
لماذا يُستخدم XML في كل مكان؟
للكثير من المطورين الذين يبنون تطبيقات حديثة، يشعر XML كمُتَرَك. ولكن في الواقع — خصوصاً في البرمجيات المؤسسية، والبنوك، والرعاية الصحية، ونظم الحكومة — يُعد XML بنية أساسية لا تُستبدل. إليك المواقع التي ستجد فيها ذلك:
- خدمات ويب باستخدام SOAP – ما زال المعيار في المؤسسات المالية، منصات التأمين، ونظم ERP الكبيرة. من المرجح أن تمر تكاملك في مجال التكنولوجيا المالية من خلال واحدة.
- واجهات برمجة للبنوك – تُستخدم رسائل ISO 20022، ورسائل SWIFT، وعديد الواجهات الأساسية للبنوك في XML. لا يوجد خيار باستخدام REST.
- بيانات الحكومة – تقبل أو تُرجع معظم بوابات الحكومة مثل HMRC، والضريبة الأمريكية (IRS). لن تُغيّر قريبًا.
- الوسائط المؤسسية – تُستخدم أنظمة SAP، Oracle، ونماذج ESB القديمة بشكل مُباشر. إذا كنت تُكمل تكاملًا مع نظام مؤسسي، فمن المرجح أن تواجه XML.
- مُصادر RSS وAtom – ما زالت XML. تُعتمد العديد من أنظمة تدفق المحتوى، وجمع الأخبار، وبرامج المراقبة عليها.
الحقيقة غير المريحة: لم يُغادر XML لأن الأنظمة المبنية عليه لم تُستبدَل. استبدال البنية الأساسية في البنك ليس مُعدّاً لسريع. لذا، تتكيف.
الفرق الهيكلي بين XML وJSON: الأشياء التي تُسبب لك صعوبات حقيقية
قبل أن تبدأ التحويل، يُفيد أن تفهم لماذا لا يكفي مجرد تبديل التنسيق بين XML وJSON. يُمثل كل منهما البيانات بشكل مختلف، ولهذا تنشأ مواقف صعبة حقيقية.
مُقارنة جانبية: نفس البيانات في كل من التنسيقين
خذ طلب عميل بسيط. إليكه في XML:
<order id="ORD-1042" currency="GBP">
<customer>
<name>Alice Martin</name>
<email>alice@example.com</email>
</customer>
<items>
<item sku="PRD-001">
<description>Wireless Keyboard</description>
<quantity>1</quantity>
<price>49.99</price>
</item>
<item sku="PRD-007">
<description>USB-C Hub</description>
<quantity>2</quantity>
<price>29.99</price>
</item>
</items>
</order>
وهناك المقابل في JSON:
{
"order": {
"@id": "ORD-1042",
"@currency": "GBP",
"customer": {
"name": "Alice Martin",
"email": "alice@example.com"
},
"items": {
"item": [
{
"@sku": "PRD-001",
"description": "Wireless Keyboard",
"quantity": "1",
"price": "49.99"
},
{
"@sku": "PRD-007",
"description": "USB-C Hub",
"quantity": "2",
"price": "29.99"
}
]
}
}
}
يمكنك بالفعل رؤية نقاط التوتر الهيكلي. دعونا نمرّ بها.
الخصائص مقابل المفاتيح
يمكن للعناصر XML أن تُحمل خصائص (id="ORD-1042") إلى جانب عناصر الأطفال والنص. لا يوجد في JSON مفهوم للخصائص — كل شيء هو زوج مفتاح-قيمة. العادة الشائعة هي تسمية الخصائص بـ @ عند التحويل، مما يعطيك "@id": "ORD-1042". بعض المُحلّلين يستخدمون $ أو يُبسطونها بالكامل. يُهمّ المعيار لأن الكود المُستهلك يحتاج إلى معرفة أي تسمية تُتوقع.
المصفوفات مقابل العناصر المتكررة
هذا يُسبب المطورين باستمرار. في JSON، تكون المصفوفة واضحة: [...]. في XML، لا يوجد مثل هذا التمييز — العناصر المتكررة كأبناء يُفهم أنها قائمة. قد يُرجع مُحلّل يرى عنصرًا واحدًا كمُدخل. أما عنصران فسيُرجع كمصفوفة. يُنهار كودك عندما يُرجع الواجهة نتيجة واحدة. <item> الحل هو تطبيق المصفوفات على الحقول المعروفة كقائمة، أو استخدام مكتبة تُحافظ على معلومات النوع. عند تحويل بيانات فردية، تحقق من أن الحقل الذي يبدو كمُدخل فردي قد يكون قائمة في بعض المُدخلات المُنتجة. <item> النص المُدمج والمحتوى المُختلط
يمكن للعناصر XML أن تحتوي على نص وعناصر أطفال في نفس الوقت (محتوى مختلط). لا يمكن للـ JSON تمثيل هذا بشكل نظيف. يتعامل المُحلّلين معه بشكل مختلف — بعضهم يستخدم مفتاحًا
، آخرون يستخدمون
، آخرون يُبسطون المحتوى المختلط. إذا كنت تحول XML يحتوي على محتوى مختلط، فتحقق من الناتج يدويًا. #text المساحات (Namespaces) _تُحتوي ردود SOAP على مساحات XML كثيرة:
. يعتمد مُحلّلك على ما إذا كانت تُزال، أو تُدمج في اسم المفتاح (
)، أو تُحول إلى عنوان URI. غالبًا ما تُريد أن تُزال، ولكن إذا تشارك عنصران اسمًا في مساحتين، فستفقد التمييز. تعرف ما تتعامل معه قبل أن تفترض أن الناتج نظيف. <ns2:getOrderResponse xmlns:ns2="http://...">المسار السريع: تحويل XML عبر الإنترنت دون كتابة مُحلّلns2:getOrderResponseإذا كنت تُحلّل ردًا من واجهة برمجة، أو تُستكشف نمط XML غير معروف، أو تُجرّي تحويلًا فرديًا، فإن كتابة مُحلّل يُعتبر مفرطًا. استخدم
— الصق XML الخاص بك، واحصل على JSON نظيف فورًا، وتحقق من الهيكل قبل كتابة أي كود.
يُعالج المُحلّل الخصائص (باستخدام معيار مُحول XML إلى JSON )، والعناصر المُتداخلة، والعناصر المتكررة كمصفوفات، ويُحافظ على النص — مما يغطي معظم المُدخلات الواقعية للواجهات. مفيد لفهم ما يشبهه ردًا من واجهة برمجة باستخدام SOAP بعد أن تُزال الطبقة المحيطة.
التحويل البرمجي: ما يجب استخدامه في البيئة الإنتاجية @ لأعمال الإنتاج التي تُكمل تكاملًا مع واجهات برمجة XML، يُفضل استخدام مكتبة مناسبة بدلًا من كتابة مُحلّل يدوي. إليك الخيارات المُستخدمة حسب اللغة:
JavaScript / Node.js
هي الخيار الأفضل لـ Node.js. استخدم
لإجبار تطبيق المصفوفات على العناصر المعروفة كقائمة — هذا يمنع خطأ التوازي بين المُدخل الواحد والمصفوفة الذي سيظهر في البيئة الإنتاجية.
import { XMLParser } from 'fast-xml-parser';
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@',
isArray: (name) => ['item', 'product', 'order'].includes(name),
});
const result = parser.parse(xmlString);
fast-xml-parser هي الخيار القياسي في بايثون. تستخدم المعيار isArray لخصائص الخصائص و
بايثون
import xmltodict
with open('response.xml') as f:
data = xmltodict.parse(f.read())
import json
print(json.dumps(data, indent=2))
xmltodict لنص المحتوى. لاحظ أن المُخرج هو @ ، والذي يُمكن تسلسله بسهولة مع #text PHP’s OrderedDictهو السبيل السريع، لكنه يتعامل مع الخصائص بشكل غير متسق ويُفقد بيانات في حالات حافة. للاستخدام الإنتاجي مع ردود SOAP، أعدّ استخدام json.dumps.
PHP
$xml = simplexml_load_string($xmlString);
$json = json_encode($xml);
$data = json_decode($json, true);
مع simplexml_load_string + json_encode أو مكتبة مخصصة. DOMDocument المسائل الشائعة التي يجب مراقبتها LIBXML_NOBLANKS يُخرج الأرقام كنصوص.
لا يوجد نوع رقمي في XML — كل شيء نصي. ستصبح حقل السعر
- بلا تغيير، وليس . يجب تحويلها بشكل صريح بعد التحويل.
"49.99"القيم المنطقية تبقى كنصوص.49.99. تحقق قبل استخدامها في شروط. - العناصر الفارغة تصبح
<active>true</active>يتحول إلى"active": "true"أو كأوبجكت فارغ. - قد تُحول إلى
nullحسب المُحلّل. اختبر الحالة الحدية.<middleName/>مُحاطات النص (CDATA)null,""، أو{}قد تُحتفظ بها أو لا تُحتفظ بها. إذا استخدمت الواجهة مُحاطات النص لتجنب محتوى HTML، فتحقق من أن المُحلّل يتعامل معها ولا يُفقد المحتوى بشكل سري. - الترتيب ليس مضمونًا. يمكن أن يكون ترتيب العناصر مهمًا في بعض النماذج XML؛ أما ترتيب مفاتيح كائن JSON فهو ليس كذلك. إذا كان التسلسل مهمًا للنظام المُستهلك، فاحرص على التعامل معه بشكل مُحدد.
- العمل مع SOAP بشكل خاص يضيف SOAP طبقة إضافية على XML: كل رد يُغلف في علبة
مع
، غالبًا ما تُستخدم تسميات مساحات وحقل <Envelope> . قبل التحويل إلى JSON، غالبًا ما ترغب في استخراج المحتوى فقط. <Body>في بايثون مع <Header> (مُحلّل SOAP)، تُحصل على أشياء بايثون مباشرة ولا تحتاج إلى تحليل XML. في Node.js،
تُفعل نفس الشيء. إذا كنت تُواجه واجهة برمجة باستخدام zeep بشكل مباشر، فستحتاج إلى إزالة الغلاف يدويًا قبل تشغيل مُحول XML إلى JSON. soap و strong-soap للاستكشاف السريع للردود من SOAP، يكون fetch أو axiosمفيدًا — صق الغلاف الكامل، وانظر الهيكل الكامل، وحدد المسار الذي تحتاجه للحصول على البيانات.
قبل أن تُشعر نفسك بالحزن وتحاول التكيف مُحول XML إلى JSON هناك نوع خاص من الألم يشعر به المطور عندما يدرك أن مشروعه الجديد يجب أن يتكامل مع واجهة برمجة SOAP مبنية في عام 2003. اعترف بذلك، ثم انتقل. XML هو حل مُكتمل — المُحلّلين مُتطورون، الأدوات المُحولة موجودة، والمشاكل المُحتملة موثقة جيدًا. لم تكن أنت أول مطور ينظر إلى علبة بطول 400 سطر.
استخدم المكتبة المناسبة لغتك، وقم بتحويل الأنواع بشكل صريح، واجبر المصفوفات على الحقول المعروفة كقائمة، وتحقق من المُدخلات الحقيقية بدلًا من الأمثلة المثالية في وثائق الواجهة. سترى في الوثائق مثالًا واحدًا؛ أما في البيئة الإنتاجية فسيُرسل لك خمسون.
وإذا كنت تُجرّي أعمال استكشاف — فهم نمط XML غير معروف، أو التحقق من التحويل قبل كتابة الكود — احتفظ بـ
مُختَرَم. فهو أسرع من تشغيل سكربت كل مرة تحتاجها لفحص مُدخل.
XML ليس ميتًا (بأسف) — تحويله إلى JSON مثل شخص مُنضج 2 مُحول XML إلى JSON XML ليس ميتًا (بأسف) — تحويله إلى JSON مثل شخص مُنضج 1
تثبيت ملحقاتنا
أضف أدوات IO إلى متصفحك المفضل للوصول الفوري والبحث بشكل أسرع
恵 وصلت لوحة النتائج!
لوحة النتائج هي طريقة ممتعة لتتبع ألعابك، يتم تخزين جميع البيانات في متصفحك. المزيد من الميزات قريبا!
