Wissen

KNOW-HOW FÜR FORTSCHRITT

Neben den zahlreichen Einsatzmöglichkeiten von Node.js ist ein Hauptanwendungsfall die Verwendung als API-Schnittstelle für mobile – und Web-Anwendungen. Viele andere – oft ältere – Schnittstellen unterstützen jedoch kein JSON-Format, sondern nur XML. Die Verarbeitung solcher Daten in Node.js ist nicht ohne Weiteres möglich. Für dieses Szenario bietet das node-Modul xml2js eine Lösung. Damit lassen sich XML-Strukturen einfach in JSON-Objekte umwandeln.

Wie die meisten node-Module kann auch xml2js über npm installiert werden.
npm install xml2js

Als nächstes wird das Modul in der entsprechenden Javascript-Datei geladen.

var xml2js = require('xml2js');

Xml2JS setzt sich aus zwei Bestandteilen zusammen:

  • Parser – XML-Daten in ein JSON-Objekt umwandlen
  • Builder – JSON-Objekte in XML-Daten umwandeln

Parser

Für das Umwandeln der XML-Daten muss zuerst ein neuer Parser erstellt werden. Danach besitzt dieser Parser eine parseString() Funktion, die einen XML-String erwartet.
Im folgendem Beispiel wird angenommen, dass es eine XML-Datei mit dem Namen ‚data.xml‘ gibt. Diese hat einen einfachen XML-Inhalt.

<?xml version="1.0" encoding="UTF-8"?>
<widget id="meineId" version="1.0">
    <name>MeinName</name>
    <description>Test</description>
</widget>
var xml2js = require('xml2js'), // xml2js Modul
    parser = new xml2js.Parser(), // Parser Objekt
    fs = require('fs'); // NodeJS Dateisystem Modul

// Datei einlesen
fs.readFile('data.xml', function (err, data) {
    // XML-String in JSON umwandeln
    parser.parseString(data, function (err, result) {
        // result beinhaltet das JSON-Objekt
    });
});

Als Ergebnis spuckt parseString ein JSON-Objekt aus, auf dem die Tags als Schlüssel und die Inhalte als Wert gesetzt sind. So entstehen aus verschachtelten XML-Tags auch verschachtelte JSON-Objekte. Des Weiteren werden Attribute eines Tags auf einem extra Schlüssel „$“ abgelegt. Aus der data.xml entsteht dann folgendendes JSON-Objekt:

result = {
  "widget": {
    "$": {
        "id": {
            "meineId"
        },
        "version": {
            "1.0"
        }
    },
    "name": ["MeinName"],
    "description": ["Test"] 
  }
}

Standardmäßig setzt das Modul alle Kinder-Elemente in ein Array. Da es ja zwei Tags oder mehr geben könnte. Dieses Verhalten lässt sich einfach über Optionen steuern.

parser.parseString(data, {
    explicitArray: false, // keine expliziten Arrays
    ignoreAttrs : true // keine Attribute
}, function (err, result) {
    // result beinhaltet das JSON-Objekt ohne Attribute, etc.
});

Als Ergebnis werden nun einzelne Kinder nicht in Arrays umgewandelt und die Attribute fehlen.

result = {
  "widget": {
    "name": "MeinName",
    "description": "Test" 
  }
}

Eine vollständige Liste von Optionen gibt es im GitHub Repository von xml2js.

Builder

Für das Umwandeln der JSON-Daten muss zuerst ein neuer Builder erstellt werden. Danach besitzt dieser Builder eine buildObject()-Funktion, die ein JSON-Objekt erwartet.
Im folgendem Beispiel wird angenommen, dass es die Variable result mit dem oben stehenden Inhalt gibt.

var xml2js = require('xml2js'), // xml2js Modul
    builder = new xml2js.Builder(), // Builder Objekt
    fs = require('fs'), // NodeJS Dateisystem Modul
    result = {
        "widget": {
            "name": "meinName",
            "description": "meineBeschreibung"
        }
    };    

// JSON in XML-String umwandeln
var xml = builder.buildObject(result);

// Datei schreiben
fs.writeFile('data.xml', xml, function (err) {
    // Datei geschrieben
});

Eine vollständige Liste von Optionen für den Builder gibt es im GitHub Repository von xml2js.

Fazit

Für einfache XML-Konstrukte funktioniert das Modul sehr gut und ist einfach zu bedienen. Im Vergleich zu anderen XML Parsern ist xml2js jedoch eher langsam, bietet für den Einstieg in diesen Themenbereich aber genug Potential. Standard-Anwendungsfälle lassen sich damit schnell umsetzen und bewältigen. Kommt es wirklich auf jede Millisekunde an, kann alternativ auch htmlparser2 benutzt werden. Dieses Modul ist ein wenig komplexer und komplizierter, erreicht jedoch weit bessere Ergebnisse im Performance-Test.

Wir freuen uns über eine Bewertung, um ein Feedback zu erhalten:

Durchschnittlich 3.7 Sterne aus 3 Meinungen.