Arbeiten mit XML in TypeScript: vom Parsing bis zur Generierung
XML (eXtensible Markup Language) bleibt eines der wichtigsten Formate für Datenaustausch, Konfigurationsdateien und Dokumentenverwaltung. Im TypeScript-Ökosystem stehen mehrere leistungsstarke Bibliotheken zur Verfügung, die eine effiziente Arbeit mit XML ermöglichen, während sie strenge Typisierung und die Vorteile der statischen Analyse bewahren. In diesem Artikel betrachten wir die wichtigsten Werkzeuge, ihre Funktionen und geben praktische Anwendungsbeispiele.
Warum sollte man TypeScript für die Arbeit mit XML verwenden?
TypeScript fügt JavaScript ein Typsystem hinzu, das besonders bei der Arbeit mit XML-Dokumenten komplexer Struktur nützlich ist. Sie können Datenschemata über Schnittstellen beschreiben, Fehler beim Zugriff auf verschachtelte Elemente vermeiden und in der IDE automatisch Autovervollständigung erhalten. Darüber hinaus verfügen moderne Bibliotheken für die Arbeit mit XML über Typdeklarationen (Typisierung), was ihre Verwendung maximal sicher macht.
Wichtige Bibliotheken für die Arbeit mit XML in TypeScript
- fast-xml-parser — die schnellste und funktionsreichste Bibliothek. Unterstützt Parsing in Objekt/Array, Validierung, Arbeit mit Attributen, CDATA und Namespaces.
- xml2js — klassischer Parser, der XML in JavaScript-Objekte umwandelt. Unterstützt asynchrones Parsing und benutzerdefinierte Optionen.
- xmldom — Implementierung eines DOM-Parsers für Node.js und den Browser. Ermöglicht die Manipulation des XML-Baums wie im Browser-DOM.
- xmlbuilder2 — moderne Bibliothek zur Erstellung von XML-Dokumenten mit einer verkettbaren API und vollständiger Typunterstützung.
Installation der Bibliotheken
Installieren Sie zunächst eine der Bibliotheken über npm. Alle verfügen über integrierte Typdeklarationen:
npm install fast-xml-parsernpm install xml2jsnpm install @xmldom/xmldomnpm install xmlbuilder2Beispiel 1: Parsing von XML mit fast-xml-parser
Betrachten wir ein grundlegendes Beispiel für das Parsen eines XML-Strings in ein typisiertes Objekt:
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"Beachten Sie die Option isArray — sie stellt sicher, dass das Element book immer ein Array ist, auch wenn im XML nur ein Buch vorhanden ist. Dies vereinfacht die weitere Verarbeitung.
Beispiel 2: Erstellung von XML mit xmlbuilder2
Die Bibliothek xmlbuilder2 bietet eine praktische verkettbare Schnittstelle zur Generierung von 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>