23 février 2012

node-xml-mapping = xml2json.js & json2xml.js

xml-mapping est un module NodeJS qui permet de transformer des données XML en une structure de données Javascript (JSON). Ce module permet également de réaliser l'opération inverse en transformant une structure de données Javascript en XML. Ce module se caractérise par quelques avantages :

  • 100% Javascript
  • Bidirectionnel
  • Prise en charge des Comments, des CDATA, des Processing Instructions

Convention

Pour transformer du XML en JSON il faut des règles de correspondance. Ce module reprend celles utilisées par Google dans son protocole GData (cf. http://code.google.com/apis/gdata/docs/json.html ). L'approche des ingénieurs Google est intéressante car elle cherche à adapter la structure des données aux caractéristiques de Javascript. Par exemple, les attributs ne sont pas dans un tableau d'attributs ou bien la valeur d'un balise est stockée dans un champ spécial ou encore les sous balises sont regroupées dans une collection et les balises multi-occurrentes sont regroupées dans un tableau.

Démonstration

Ce démonstrateur :

var xm = require('../lib/xml-mapping.js')
 ,util = require('util')
 ,assert = require('assert');

[
 '<key>value</key>'
 ,'<key attr="value1">value2</key>'
 ,'<key><key1>value1</key1><key2>value2</key2></key>'
 ,'<key><key>value1</key><key>value2</key></key>'
 ,'<key><key><key>value2</key></key></key>'
 ,'<key><![CDATA[value]]></key>'
 ,'<key><!--value--></key>'
].forEach(function(xml) {
  var json = xm.tojson(xml);
  process.stdout.write(xml);
  process.stdout.write('\n');
  process.stdout.write(util.inspect(json, false, null, true));
  process.stdout.write('\n\n');
  assert.equal(xml, xm.toxml(json));
})

affichera :

<key>value</key>
{ key: { '$t': 'value' } }

<key attr="value1">value2</key>
{ key: { attr: 'value1', '$t': 'value2' } }

<key><key1>value1</key1><key2>value2</key2></key>
{ key: 
   { key1: { '$t': 'value1' },
     key2: { '$t': 'value2' } } }

<key><key>value1</key><key>value2</key></key>
{ key: 
   { key: 
      [ { '$t': 'value1' },
        { '$t': 'value2' } ] } }

<key><key><key>value2</key></key></key>
{ key: { key: { key: { '$t': 'value2' } } } }

<key><![CDATA[value]]></key>
{ key: { '$cd': 'value' } }

<key><!--value--></key>
{ key: { '$c': 'value' } }


Installation et code source

Le code source est disponible sur GitHub : http://github.com/lindory-project/node-xml-mapping

et on peut directement l'installer avec NPM :

% npm install xml-mapping