Введение в работу с XML в среде Node.js
XML (eXtensible Markup Language) остаётся востребованным форматом для хранения и передачи структурированных данных, особенно в корпоративных системах, медицинских протоколах и устаревших API. В экосистеме Node.js существует несколько зрелых библиотек, позволяющих эффективно парсить, создавать и модифицировать XML-документы. В этой статье мы рассмотрим ключевые инструменты: fast-xml-parser, xml2js, xmlbuilder2 и xpath.
Установка необходимых пакетов
Для начала установите пакеты через npm:
npm install fast-xml-parser xml2js xmlbuilder2 xpath
1. Парсинг XML с помощью fast-xml-parser
fast-xml-parser — самая производительная библиотека для разбора XML в JavaScript. Она поддерживает атрибуты, пространства имён и преобразование в JSON.
Базовый парсинг
const { XMLParser } = require('fast-xml-parser');
const xmlData = `
<bookstore>
<book category="fiction">
<title lang="en">The Great Gatsby</title>
<author>F. Scott Fitzgerald</author>
<year>1925</year>
</book>
</bookstore>`;
const parser = new XMLParser({
ignoreAttributes: false, // Сохранять атрибуты
attributeNamePrefix: '@_' // Префикс для атрибутов
});
const result = parser.parse(xmlData);
console.log(result.bookstore.book[0].title);
// 'The Great Gatsby'
console.log(result.bookstore.book[0]['@_category']);
// 'fiction'
Парсинг с проверкой на ошибки
const { XMLParser, XMLValidator } = require('fast-xml-parser');
const invalidXml = '<root><item>Unclosed';
if (XMLValidator.validate(invalidXml) === true) {
const parser = new XMLParser();
const data = parser.parse(invalidXml);
} else {
console.error('Некорректный XML');
// Вывод: true (если валиден) или объект ошибки
}
2. Библиотека xml2js — удобное преобразование в JSON
xml2js предоставляет callback-ориентированный API и поддерживает кастомные настройки парсинга.
const xml2js = require('xml2js');
const parser = new xml2js.Parser({
explicitArray: false, // Одиночные элементы не оборачивать в массив
attrkey: 'attributes'
});
const xml = `<person id="123">
<name>John Doe</name>
<age>30</age>
</person>`;
parser.parseString(xml, (err, result) => {
if (err) {
console.error('Ошибка парсинга:', err);
return;
}
console.log(result.person.name); // 'John Doe'
console.log(result.person.attributes.id); // '123'
});
Промис-обёртка для xml2js
const { parseStringPromise } = require('xml2js');
async function parseXML(xmlString) {
try {
const data = await parseStringPromise(xmlString, {
explicitArray: false
});
return data;
} catch (error) {
console.error('Ошибка:', error.message);
}
}
3. Создание XML с помощью xmlbuilder2
xmlbuilder2 — современная библиотека для генерации XML-документов с цепочечным интерфейсом (fluent API).
Простое создание XML
const { create } = require('xmlbuilder2');
const doc = create({ version: '1.0', encoding: 'UTF-8' })
.ele('catalog')
.ele('book', { id: 'b1' })
.ele('title').txt('JavaScript: The Good Parts').up()
.ele('author').txt('Douglas Crockford').up()
.ele('price', { currency: 'USD' }).txt('29.99').up()
.up()
.end({ prettyPrint: true });
console.log(doc);
Результат:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="b1">
<title>JavaScript: The Good Parts</title>
<author>Douglas Crockford</author>
<price currency="USD">29.99</price>
</book>
</catalog>
Создание XML из объекта
const { create } = require('xmlbuilder2');
const data = {
root: {
item: [
{ '@id': 1, name: 'Laptop', price: 1200 },
{ '@id': 2, name: 'Mouse', price: 25 }
]
}
};
const xml = create Также в библиотеке
xUnit / NUnit для C# (.NET): полное руководство с примерами
Отправка SMS на Rust: RustSMS — API библиотека для работы с SMS-шлюзами
Работа с CSV в Kotlin: библиотеки, парсинг и запись данных
Отправка email на Swift: библиотеки и примеры для iOS/macOS
Логирование для C++: лучшие решения (spdlog, glog, P7)