Trabajo con XML en TypeScript: bibliotecas y ejemplos prácticos
XML (eXtensible Markup Language) sigue siendo un formato demandado para el intercambio de datos, archivos de configuración e integración con sistemas heredados. A pesar de la popularidad de JSON, muchas soluciones empresariales, servicios SOAP y formatos de datos (por ejemplo, SVG, RSS, XSLT) todavía utilizan XML. En TypeScript, gracias al tipado estático, trabajar con XML se vuelve más fiable y predecible. En este artículo, analizaremos las mejores bibliotecas para analizar, crear y validar documentos XML en TypeScript.
Bibliotecas principales para trabajar con XML en TypeScript
Hoy en día, existen varias bibliotecas maduras que funcionan excelentemente con TypeScript. Consideremos las tres más populares:
- fast-xml-parser — la biblioteca más rápida para analizar XML en JavaScript/TypeScript. Soporta validación, conversión a JSON y viceversa.
- xml2js — una biblioteca clásica con una API simple, convierte XML en objetos de JavaScript. Tiene soporte integrado para TypeScript a través de @types/xml2js.
- xmldom — una implementación de DOM Level 2 para Node.js, permite trabajar con XML como un árbol DOM (similar al DOMParser del navegador).
Instalación y configuración
Para empezar, instale una de las bibliotecas a través de npm:
npm install fast-xml-parser xml2js xmldom @types/xml2jsAhora veamos ejemplos prácticos para cada biblioteca.
Ejemplo 1: Análisis de XML con fast-xml-parser
fast-xml-parser ofrece un alto rendimiento y una API conveniente para convertir XML en objetos TypeScript comunes.
import { XMLParser, XMLBuilder, XMLValidator } from 'fast-xml-parser';
// XML de origenconst 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>`;
// Configuración del analizadorconst parser = new XMLParser({ ignoreAttributes: false, // Conservar atributos attributeNamePrefix: '@_', // Prefijo para atributos textNodeName: '#text', // Nombre para nodos de texto isArray: (tagName) => ['book'].includes(tagName) // Siempre devolver un array para <book>});
// Análisisconst result = parser.parse(xmlData);console.log(JSON.stringify(result, null, 2));
// Tipado del resultadointerface Book { '@_id': string; title: string; author: string; price: { '@_currency': string; '#text': string; };}
interface Catalog { catalog: { book: Book[]; };}
const catalog = result as Catalog;console.log(`Primer libro: ${catalog.catalog.book[0].title}`);Tenga en cuenta el parámetro isArray — garantiza que el elemento book siempre será un array, incluso si en el XML solo aparece un libro.
Ejemplo 2: Creación de XML con xml2js
La biblioteca xml2js es útil para construir XML a partir de objetos de JavaScript. Utiliza Builder para la serialización.
import { Builder } from 'xml2js';
// Objeto para convertir a XMLconst data = { root: { $: { version: '1.0', encoding: 'UTF-8' }, user: [ { $: { id: '1', active: 'true' }, name: 'Iván Petrov', email: 'ivan@example.com', roles: { role: ['admin', 'editor'] } }, { $: { id: '2', active: 'false' }, name: 'María Sidorova', email: 'maria@example.com', roles: { role: ['viewer']