Работа с 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"?>
< Также в библиотеке
Отправка email на Rust: библиотеки lettre и mailparse для писем
Redis клиент (go-redis) для Go: полное руководство с примерами
CLI-фреймворки для PHP: Symfony Console и Laravel Zero — полное руководство