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
Et
RépondreSupprimer<key><key>value</key></key>
donnera
{ key:
{ key:
{ '$t': 'value' } } }
?
Si c'est bien ça, c'est embêtant dans le cas où on n'a qu'une seule valeur au niveau 2, et pas plusieurs (comme dans les exemples), car le JSON retourné n'est pas structuré de la même façon.