24 Feb

Generare file XML con Node.js

Programming 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!