.gitignore000066400000000000000000000000231516067312600130500ustar00rootroot00000000000000node_modules *.swp README.md000066400000000000000000000012601516067312600123430ustar00rootroot00000000000000# Simple SAX-based XML2JSON Parser. It does not parse the following elements: * CDATA sections * Processing instructions * XML declarations * Entity declarations * Comments ## Installation npm install xml2json ## Usage ```javascript var parser = require('xml2json'); var xml = "bar"; var json = parser.toJson(xml); //returns an string containing the json structure by default console.log(json); ``` * if you want to get the Javascript object then you might want to invoke parser.toJson(xml, {object: true}); * if you want a reversible json to xml then you should use parser.toJson(xml, {reversible: true}); ## License Copyright 2011 BugLabs Inc. All rights reserved. index.js000066400000000000000000000000431516067312600125270ustar00rootroot00000000000000module.exports = require('./lib'); lib/000077500000000000000000000000001516067312600116335ustar00rootroot00000000000000lib/index.js000066400000000000000000000050451516067312600133040ustar00rootroot00000000000000var expat = require('node-expat'); var fs = require('fs'); var parser = new expat.Parser('UTF-8'); // This object will hold the final result. var obj = {}; var currentObject = obj; var ancestors = []; var options = {}; //configuration options function startElement(name, attrs) { if (! (name in currentObject)) { currentObject[name] = attrs; } else if (! (currentObject[name] instanceof Array)) { // Put the existing object in an array. var newArray = [currentObject[name]]; // Add the new object to the array. newArray.push(attrs); // Point to the new array. currentObject[name] = newArray; } else { // An array already exists, push the attributes on to it. currentObject[name].push(attrs); } // Store the current (old) parent. ancestors.push(currentObject); // We are now working with this object, so it becomes the current parent. if (currentObject[name] instanceof Array) { // If it is an array, get the last element of the array. currentObject = currentObject[name][currentObject[name].length - 1]; } else { // Otherwise, use the object itself. currentObject = currentObject[name]; } } function text(data) { data = data.trim(); if (!data.length) { return; } currentObject['$t'] = data; } function endElement(name) { // This should check to make sure that the name we're ending // matches the name we started on. var ancestor = ancestors.pop(); if (!options.reversible) { if ((Object.keys(currentObject).length == 1) && ('$t' in currentObject)) { if (ancestor[name] instanceof Array) { //console.log("list-replacing $t in " + name); ancestor[name].push(ancestor[name].pop()['$t']); } else { //console.log("replacing $t in " + name); ancestor[name] = currentObject['$t']; } } else { //console.log("final " + name + ":"); //console.log(currentObject); } } currentObject = ancestor; } parser.on('startElement', startElement); parser.on('text', text); parser.on('endElement', endElement); module.exports.toJson = function(xml, _options) { options = null; options = { object: false, reversible: false } for (var opt in _options) { options[opt] = _options[opt]; } if (parser.parse(xml)) { if (options.object) { return obj; } return JSON.stringify(obj); } }; package.json000066400000000000000000000006571516067312600133630ustar00rootroot00000000000000{ "name" : "xml2json", "version": "0.1.0", "author": "Andrew Turley", "email": "aturley@buglabs.net", "description" : "Converts xml to json using node-expat.", "repository": "git://github.com/buglabs/node-xml2json.git", "main": "index", "maintainers":[ { "name": "Camilo Aguilar", "email": "camilo@buglabs.net"} ], "dependencies": { "node-expat": "1.3.2" } } test/000077500000000000000000000000001516067312600120445ustar00rootroot00000000000000test/fixtures/000077500000000000000000000000001516067312600137155ustar00rootroot00000000000000test/fixtures/domain.json000066400000000000000000000012601516067312600160560ustar00rootroot00000000000000{"domain":{"type":"qemu","name":"QEmu-fedora-i686","uuid":"c7a5fdbd-cdaf-9455-926a-d65c16db1809","memory":"219200","currentMemory":"219200","vcpu":"2","os":{"type":{"arch":"i686","machine":"pc","$t":"hvm"},"boot":{"dev":"cdrom"}},"devices":{"emulator":"/usr/bin/qemu-system-x86_64","disk":[{"type":"file","device":"cdrom","source":{"file":"/home/user/boot.iso"},"target":{"dev":"hdc"},"readonly":{}},{"type":"file","device":"disk","source":{"file":"/home/user/fedora.img"},"target":{"dev":"hda"}}],"interface":{"type":"network","source":{"network":"default"}},"graphics":{"type":"vnc","port":"-1"}},"ah":[{"type":"rare","foo":"bar","$t":"cosa1"},{"type":"normal","$t":"cosa2"},"cosa3"]}} test/fixtures/domain.xml000066400000000000000000000014701516067312600157100ustar00rootroot00000000000000 QEmu-fedora-i686 c7a5fdbd-cdaf-9455-926a-d65c16db1809 219200 219200 2 hvm /usr/bin/qemu-system-x86_64 cosa1 cosa2 cosa3 test/test.js000066400000000000000000000016651516067312600133710ustar00rootroot00000000000000var fs = require('fs'); var path = require('path'); var parser = require('../lib'); var assert = require('assert'); var fixturesPath = './fixtures'; fs.readdir(fixturesPath, function(err, files) { for (var i in files) { var file = files[i]; var ext = path.extname(file); if (ext == '.xml') { var basename = path.basename(file, '.xml'); var data = fs.readFileSync(fixturesPath + '/' + file); var result = parser.toJson(data); var jsonFile = basename + '.json' var expected = fs.readFileSync(fixturesPath + '/' + jsonFile) + ''; if (result) { result = result.trim(); } if (expected) { expected = expected.trim(); } assert.deepEqual(result, expected, jsonFile + ' and ' + file + ' are different'); console.log('All tests passed!'); } } });