العمل مع XML في TypeScript: المكتبات والأمثلة العملية
XML (eXtensible Markup Language) لا يزال تنسيقًا مطلوبًا لتبادل البيانات وملفات التكوين والتكامل مع الأنظمة القديمة. على الرغم من شعبية JSON، لا تزال العديد من حلول المؤسسات وخدمات SOAP وتنسيقات البيانات (مثل SVG و RSS و XSLT) تستخدم XML. في TypeScript، وبفضل التصنيف الثابت (static typing)، يصبح العمل مع XML أكثر موثوقية وقابلية للتنبؤ. في هذه المقالة، سنستعرض أفضل المكتبات لتحليل وإنشاء والتحقق من صحة مستندات XML في TypeScript.
المكتبات الرئيسية للعمل مع XML في TypeScript
يوجد حاليًا العديد من المكتبات الناضجة التي تعمل بشكل ممتاز مع TypeScript. دعنا نلقي نظرة على الثلاثة الأكثر شيوعًا:
- fast-xml-parser — أسرع مكتبة لتحليل XML في JavaScript/TypeScript. تدعم التحقق من الصحة والتحويل إلى JSON والعكس.
- xml2js — مكتبة كلاسيكية بواجهة برمجة تطبيقات بسيطة، تحول XML إلى كائنات JavaScript. تدعم TypeScript بشكل مدمج عبر @types/xml2js.
- xmldom — تطبيق DOM Level 2 لـ Node.js، يسمح بالعمل مع XML كشجرة DOM (على غرار DOMParser في المتصفح).
التثبيت والإعداد
للبدء، قم بتثبيت إحدى المكتبات عبر npm:
npm install fast-xml-parser xml2js xmldom @types/xml2jsالآن دعنا نستعرض الأمثلة العملية لكل مكتبة.
مثال 1: تحليل XML باستخدام fast-xml-parser
تقدم fast-xml-parser أداءً عاليًا وواجهة برمجة تطبيقات مريحة لتحويل XML إلى كائنات TypeScript عادية.
import { XMLParser, XMLBuilder, XMLValidator } from 'fast-xml-parser';
// XML المصدرconst xmlData = `<?xml version="1.0" encoding="UTF-8"?><catalog> <book id="101"> <title>TypeScript Handbook</title> <author>Microsoft</author> <price currency="USD">29.99</price> </book> <book id="102"> <title>Node.js Design Patterns</title> <author>Mario Casciaro</author> <price currency="EUR">34.50</price> </book></catalog>`;
// إعدادات المحللconst parser = new XMLParser({ ignoreAttributes: false, // الاحتفاظ بالسمات attributeNamePrefix: '@_', // بادئة للسمات textNodeName: '#text', // اسم لعقد النص isArray: (tagName) => ['book'].includes(tagName) // إرجاع مصفوفة دائمًا لـ <book>});
// التحليلconst result = parser.parse(xmlData);console.log(JSON.stringify(result, null, 2));
// كتابة النتيجةinterface Book { '@_id': string; title: string; author: string; price: { '@_currency': string; '#text': string; };}
interface Catalog { catalog: { book: Book[]; };}
const catalog = result as Catalog;console.log(`الكتاب الأول: ${catalog.catalog.book[0].title}`);لاحظ المعامل isArray — فهو يضمن أن العنصر book سيكون دائمًا مصفوفة، حتى إذا كان هناك كتاب واحد فقط في XML.
مثال 2: إنشاء XML باستخدام xml2js
مكتبة xml2js مناسبة لبناء XML من كائنات JavaScript. تستخدم Builder للتسلسل.
import { Builder } from 'xml2js';
// الكائن المراد تحويله إلى XMLconst data = { root: { $: { version: '1.0', encoding: 'UTF-8' }, user: [ { $: { id: '1', active: 'true' }, name: 'إيفان بيتروف', email: 'ivan@example.com', roles: { role: ['admin', 'editor'] } }, { $: { id: '2', active: 'false' }, name: 'ماريا سيدوروفا', email: 'maria@example.com', roles: { role: ['viewer']