Работа с XML в JavaScript (Node.js): парсинг, создание и валидация

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с 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                    

Рекомендаций