العمل مع XML في JavaScript (Node.js): المكتبات، التحليل والإنشاء
XML (eXtensible Markup Language) لا يزال تنسيقًا مطلوبًا لتبادل البيانات في الأنظمة المؤسسية وملفات التكوين وواجهات برمجة التطبيقات القديمة. في نظام Node.js البيئي، توجد عدة مكتبات ناضجة تتيح تحليل وإنشاء وتحويل مستندات XML بكفاءة. في هذه المقالة، سنستعرض ثلاث مكتبات الأكثر شيوعًا: fast-xml-parser و xml2js و libxmljs، وسنقدم أمثلة عملية لاستخدامها.
1. fast-xml-parser — محلل سريع وآمن
fast-xml-parser هي واحدة من أكثر المكتبات أداءً للعمل مع XML في Node.js. تدعم التحليل المتزامن وغير المتزامن، كما يمكنها التحقق من صحة مستندات XML وفقًا لمخططات XSD.
التثبيت
npm install fast-xml-parserمثال على تحليل XML إلى كائن JavaScript
const { XMLParser } = require('fast-xml-parser');
const xmlData = `<?xml version="1.0" encoding="UTF-8"?><bookstore> <book category="programming"> <title lang="en">JavaScript: The Good Parts</title> <author>Douglas Crockford</author> <year>2008</year> <price>29.99</price> </book></bookstore>`;
const parser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_'});
const result = parser.parse(xmlData);console.log(JSON.stringify(result, null, 2));يسمح الإعداد ignoreAttributes: false بالاحتفاظ بسمات وسوم XML، بينما يضيف attributeNamePrefix بادئة لأسماء السمات لمنع التعارض مع الوسوم العادية.
إنشاء XML من كائن
const { XMLBuilder } = require('fast-xml-parser');
const builder = new XMLBuilder({ format: true, ignoreAttributes: false});
const obj = { bookstore: { book: { '@_category': 'programming', title: { '@_lang': 'en', '#text': 'Clean Code' }, author: 'Robert C. Martin', year: 2008, price: 39.99 } }};
const xmlOutput = builder.build(obj);console.log(xmlOutput);2. xml2js — محول بسيط وموثوق
xml2js هي مكتبة كلاسيكية لتحويل XML إلى JSON والعكس. توفر واجهة برمجة تطبيقات بسيطة وموثقة جيدًا.
التثبيت
npm install xml2jsتحليل XML مع معالجة الأخطاء
const xml2js = require('xml2js');const fs = require('fs');
const parser = new xml2js.Parser({ explicitArray: false, // لا يلف العناصر المفردة في مصفوفات trim: true, normalizeTags: true // تطبيع حالة الوسوم});
fs.readFile('config.xml', 'utf-8', (err, data) => { if (err) { console.error('خطأ في قراءة الملف:', err); return; } parser.parseString(data, (parseErr, result) => { if (parseErr) { console.error('خطأ في تحليل XML:', parseErr); return; } console.log('معلمات التكوين:', result.configuration); });});إنشاء XML باستخدام xml2js
const xml2js = require('xml2js');
const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, renderOpts: { pretty: true, indent: ' ' }});
const obj = { response: { status: 'success', data: { user: { id: 123, name: 'إيفان بيتروف', email: 'ivan@example.com' } } }};
const xml = builder.buildObject(obj);console.log(xml);3. libxmljs — للعمل المتقدم مع XML
l