Работа с XML в TypeScript: от парсинга до генерации
XML (eXtensible Markup Language) остаётся одним из ключевых форматов для обмена данными, конфигурационных файлов и документооборота. В экосистеме TypeScript доступно несколько мощных библиотек, которые позволяют эффективно работать с XML, сохраняя строгую типизацию и преимущества статического анализа. В этой статье мы рассмотрим основные инструменты, их возможности и приведём практические примеры использования.
Почему стоит использовать TypeScript для работы с XML?
TypeScript добавляет к JavaScript систему типов, что особенно полезно при работе с XML-документами сложной структуры. Вы можете описывать схемы данных через интерфейсы, избегать ошибок при доступе к вложенным элементам и автоматически получать автодополнение в IDE. Кроме того, современные библиотеки для работы с XML имеют декларации типов (типизацию), что делает их использование максимально безопасным.
Основные библиотеки для работы с XML в TypeScript
- fast-xml-parser — самая быстрая и функциональная библиотека. Поддерживает парсинг в объект/массив, валидацию, работу с атрибутами, CDATA и пространствами имён.
- xml2js — классический парсер, преобразующий XML в JavaScript-объекты. Есть поддержка асинхронного парсинга и кастомных опций.
- xmldom — реализация DOM-парсера для Node.js и браузера. Позволяет манипулировать XML-деревом как в браузерном DOM.
- xmlbuilder2 — современная библиотека для создания XML-документов с цепочечным API и полной поддержкой типов.
Установка библиотек
Для начала работы установите одну из библиотек через npm. Все они имеют встроенные декларации типов:
npm install fast-xml-parser
npm install xml2js
npm install @xmldom/xmldom
npm install xmlbuilder2
Пример 1: Парсинг XML с помощью fast-xml-parser
Рассмотрим базовый пример разбора XML-строки в типизированный объект:
import { XMLParser } from 'fast-xml-parser';
interface Book {
title: string;
author: string;
year: number;
price?: number;
}
interface Catalog {
catalog: {
book: Book | Book[];
};
}
const xmlData = `
<catalog>
<book>
<title>TypeScript Handbook</title>
<author>Microsoft</author>
<year>2023</year>
</book>
<book>
<title>XML for Developers</title>
<author>John Doe</author>
<year>2022</year>
<price>29.99</price>
</book>
</catalog>
`;
const parser = new XMLParser({
ignoreAttributes: false,
attributeNamePrefix: '@_',
isArray: (name) => name === 'book',
});
const result: Catalog = parser.parse(xmlData);
console.log(result.catalog.book[0].title); // "TypeScript Handbook"
Обратите внимание на опцию isArray — она гарантирует, что элемент book всегда будет массивом, даже если в XML только одна книга. Это упрощает дальнейшую обработку.
Пример 2: Создание XML с помощью xmlbuilder2
Библиотека xmlbuilder2 предоставляет удобный цепочечный интерфейс для генерации XML:
import { create } from 'xmlbuilder2';
interface User {
id: number;
name: string;
email: string;
}
const user: User = {
id: 42,
name: 'Alice',
email: 'alice@example.com'
};
const doc = create({ version: '1.0', encoding: 'UTF-8' })
.ele('users')
.ele('user', { id: user.id.toString() })
.ele('name').txt(user.name).up()
.ele('email').txt(user.email).up()
.up()
.up();
const xmlString: string = doc.end({ prettyPrint: true });
console.log(xmlString);
/*
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="42">
<name>Alice</name>
<email>alice@example.com</email>
</user>
</users>
*/
Метод .up() поднимается на один уровень вверх по дереву, что позволяет строить вложенные структуры без лишних переменных.
Пример 3: Валидация XML с помощью fast-xml-parser
Библиотека fast-xml-parser включает встроенный валидатор, который проверяет корректность XML-синтаксиса:
import {