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!