Работа с XML в TypeScript: библиотеки, парсинг и создание XML-документов

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

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

Начать курс

Работа с XML в TypeScript: библиотеки и практические примеры

XML (eXtensible Markup Language) остаётся востребованным форматом для обмена данными, конфигурационных файлов и интеграции с устаревшими системами. Несмотря на популярность JSON, многие enterprise-решения, SOAP-сервисы и форматы данных (например, SVG, RSS, XSLT) по-прежнему используют XML. В TypeScript, благодаря статической типизации, работа с XML становится более надёжной и предсказуемой. В этой статье мы разберём лучшие библиотеки для парсинга, создания и валидации XML-документов в TypeScript.

Основные библиотеки для работы с XML в TypeScript

На сегодняшний день существует несколько зрелых библиотек, которые отлично работают с TypeScript. Рассмотрим три наиболее популярных:

  • fast-xml-parser — самая быстрая библиотека для парсинга XML в JavaScript/TypeScript. Поддерживает валидацию, преобразование в JSON и обратно.
  • xml2js — классическая библиотека с простым API, преобразует 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 предлагает высокую производительность и удобный API для преобразования 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';

// Объект для преобразования в XML
const 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']
        }
      }
    ]
  }
};

// Настройки Builder
const builder = new Builder({
  xmldec: { version: '1.0', encoding: 'UTF-8' }, // XML-декларация
  renderOpts: { pretty: true, indent: '  ' }     // Форматирование
});

// Создание XML
const xml = builder.buildObject(data);
console.log(xml);

Результат выполнения:

<?xml version="1.0" encoding="UTF-8"?>
<                    

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