العمل مع XML في TypeScript: من التحليل إلى التوليد
XML (لغة الترميز القابلة للتوسيع) لا يزال أحد التنسيقات الرئيسية لتبادل البيانات وملفات التكوين وسير العمل المستندي. في نظام TypeScript البيئي، تتوفر عدة مكتبات قوية تتيح العمل بكفاءة مع XML مع الحفاظ على الكتابة الصارمة ومزايا التحليل الثابت. في هذه المقالة، سنستعرض الأدوات الرئيسية وإمكانياتها ونقدم أمثلة عملية على الاستخدام.
لماذا يجب استخدام TypeScript للعمل مع XML؟
يضيف TypeScript نظامًا للأنواع إلى JavaScript، وهو مفيد بشكل خاص عند العمل مع مستندات XML ذات بنية معقدة. يمكنك وصف مخططات البيانات من خلال الواجهات، وتجنب الأخطاء عند الوصول إلى العناصر المتداخلة، والحصول تلقائيًا على الإكمال التلقائي في بيئة التطوير المتكاملة. بالإضافة إلى ذلك، تحتوي المكتبات الحديثة للعمل مع XML على تعريفات أنواع (كتابة)، مما يجعل استخدامها آمنًا قدر الإمكان.
المكتبات الرئيسية للعمل مع XML في TypeScript
- fast-xml-parser — أسرع مكتبة وأكثرها وظيفية. تدعم التحليل إلى كائن/مصفوفة، والتحقق من الصحة، والعمل مع السمات، وCDATA، ومساحات الأسماء.
- xml2js — محلل كلاسيكي يحول XML إلى كائنات JavaScript. يدعم التحليل غير المتزامن والخيارات المخصصة.
- xmldom — تنفيذ محلل DOM لـ Node.js والمتصفح. يسمح بالتلاعب بشجرة XML كما في DOM الخاص بالمتصفح.
- xmlbuilder2 — مكتبة حديثة لإنشاء مستندات XML بواجهة برمجة تطبيقات متسلسلة ودعم كامل للأنواع.
تثبيت المكتبات
للبدء، قم بتثبيت إحدى المكتبات عبر npm. جميعها تحتوي على تعريفات أنواع مدمجة:
npm install fast-xml-parsernpm install xml2jsnpm install @xmldom/xmldomnpm install xmlbuilder2مثال 1: تحليل XML باستخدام fast-xml-parser
لننظر إلى مثال أساسي لتحليل سلسلة XML إلى كائن مكتوب:
import { XMLParser } from 'fast-xml-parser';
interface Book { title: string; author: string; year: number; price?: number;}
interface Catalog { catalog: { book: Book | Book[]; };}
const xmlData = ` <catalog> <book> <title>TypeScript Handbook</title> <author>Microsoft</author> <year>2023</year> </book> <book> <title>XML for Developers</title> <author>John Doe</author> <year>2022</year> <price>29.99</price> </book> </catalog>`;
const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_', isArray: (name) => name === 'book',});
const result: Catalog = parser.parse(xmlData);console.log(result.catalog.book[0].title); // "TypeScript Handbook"لاحظ الخيار isArray — فهو يضمن أن العنصر book سيكون دائمًا مصفوفة، حتى إذا كان هناك كتاب واحد فقط في XML. هذا يبسط المعالجة اللاحقة.
مثال 2: إنشاء XML باستخدام xmlbuilder2
توفر مكتبة xmlbuilder2 واجهة متسلسلة مريحة لتوليد XML:
import { create } from 'xmlbuilder2';
interface User { id: number; name: string; email: string;}
const user: User = { id: 42, name: 'Alice', email: 'alice@example.com'};
const doc = create({ version: '1.0', encoding: 'UTF-8' }) .ele('users') .ele('user', { id: user.id.toString() }) .ele('name').txt(user.name).up() .ele('email').txt(user.email).up() .up() .up();
const xmlString: string = doc.end({ prettyPrint: true });console.log(xmlString);/*<?xml version="1.0" encoding="UTF-8"?><users> <user id="42"> <name>Alice</name>