Generare file XML con Node.js

Come sappiamo XML (eXtensible Markup Language) è un metalinguaggio utilizzato per definire linguaggi di markup. In parole più semplici, XML serve a creare nuovi linguaggi definendone le regole. I punti di forza di XML sono:
- semplicità: è basato su una sintassi caratterizzata da poche regole,
- interoperabilità: è supportato da una grande varietà di linguaggi di programmazione e tecnologie,
- estensibilità: gli elementi definiti possono essere estesi e adattati ad altri utilizzi.
Oggi XML è principalmente utilizzato per modellare la struttura di documenti e dati. Possiamo dire che lo ritroviamo un po’ ovunque: nei file di configurazioni delle applicazioni , nei messaggi che si scambiano i servizi web, nelle interazioni tra database eterogenei, nelle repository di dati salvate su file, ecc.
A volte è necessario generare file XML a supporto della logica delle nostre applicazioni. Per questo scopo ci vengono in aiuto Node.js e il relativo modulo XMLBuilder.
L’utilizzo di XMLBuilder è estremamente semplice. Il suo punto di forza è la facilità con la quale si possono mappare in un oggetto javascript le regole e i dati del file XML che si vuole generare.
Per utilizzare XMLBuilder bisogna innanzitutto installare node.js. Il package manager di node permette scaricare il modulo XMLBuilder tramite il comando:
> npm install xmlbuilder
Una volta installato XmlBuilder in locale ci possiamo “divertire” a generare file XML. Ad esempio, salviamo il seguente codice javascript nel file text.js
var builder = require('xmlbuilder'); var xml = builder.create('root') .ele('first') .ele('second', {'type': 'attribute text'}, '2nd node text') .end({ pretty: true}); console.log(xml);
Lanciamo Node puntando al file javascript:
d:\tmp\xmlbuilder> node test.js <?xml version="1.0"?> <root> <first_node> <second_node type="child">some node text</second_node> </first_node> </root>
Come si vede il modulo XmlBuilder ha generato il file XML seguendo le direttive definite nel file test.js
La cosa più interessante di XmlBuilder è la capacità di generare file XML a partire da oggetti javascript. Ad esempio, per ottenere lo stesso risultato, possiamo modificare il file test.js come segue:
var builder = require('xmlbuilder'); var root = builder.create('root'); var obj = { first: { second: { '#text': '2nd node text', '@type': 'attribute text' } } }; root.ele(obj); console.log(root.doc().end({ pretty: true}))
Il file XML viene generato da un oggetto javascript (obj nello script). La direttiva ‘#text’ indica di associare del testo al nodo mentre ‘@’ indica di inserire un attributo. XmlBuilder è molto flessibile e personalizzabile. Il risultato prodotto é identico al precedente:
d:\tmp\xmlbuilder> node test.js <?xml version="1.0"?> <root> <first> <second type="attribute text">2nd node text</second> </first> </root>
Si possono concatenare più oggetti, come nell’esempio sottostante:
var builder = require('xmlbuilder'); var root = builder.create('root'); var obj1 = { persona: { nome: "Mario", '@age': 35, indirizzo: { citta: "Milano" }, telefono: [ { '#text': "348-123467", '@type': 'casa' }, { '#text': "348-123567", '@type': 'ufficio' } ], id: function() { return 1; } } }; var obj2 = { persona: { nome: "Maria", '@age': 57, indirizzo: { city: "Bari" }, telefono: [ { '#text': "345-123467", '@type': 'casa' }, { '#text': "345-123567", '@type': 'ufficio' } ], id: function() { return 2; }, figlio: [ {nome: "Luigi", '@age': 25}, {nome: "Giuseppe", '@age': 23}, {nome: "Antonio", '@age': 19}, ] } }; root.ele(obj1); root.ele(obj2); console.log(root.doc().end({ pretty: true}))
Si ottiene il seguente risultato:
d:\tmp\xmlbuilder>node test.js <?xml version="1.0"?> <root> <persona age="35"> <nome>Mario</nome> <indirizzo> <citta>Milano</citta> </indirizzo> <telefono type="casa">348-123467</telefono> <telefono type="ufficio">348-123567</telefono> <id>1</id> </persona> <persona age="57"> <nome>Maria</nome> <indirizzo> <city>Bari</city> </indirizzo> <telefono type="casa">345-123467</telefono> <telefono type="ufficio">345-123567</telefono> <id>2</id> <figlio age="25"> <nome>Luigi</nome> </figlio> <figlio age="23"> <nome>Giuseppe</nome> </figlio> <figlio age="19"> <nome>Antonio</nome> </figlio> </persona> </root>
La cosa più interessante di XmlBuilder è la completa integrazione di javascript nella definizione della struttura dei file XML. Questo permette di gestire logiche particolari quando generiamo l’output, soprattutto grazie all’utilizzo di funzioni javascript.
Happy programming!