.gitignore 0000664 0000000 0000000 00000000023 15162512155 0013044 0 ustar 00root root 0000000 0000000 node_modules
*.swp
README.md 0000664 0000000 0000000 00000000341 15162512155 0012336 0 ustar 00root root 0000000 0000000 # XML to JSON converter
## Use
```javascript
var parser = require('xml2json');
var xml = "bar";
var json = parser.toJson(xml);
console.log(json);
```
## License
Copyright 2011 BugLabs Inc. All rights reserved.
index.js 0000664 0000000 0000000 00000000043 15162512155 0012523 0 ustar 00root root 0000000 0000000 module.exports = require('./lib');
lib/ 0000775 0000000 0000000 00000000000 15162512155 0011627 5 ustar 00root root 0000000 0000000 lib/index.js 0000664 0000000 0000000 00000004324 15162512155 0013277 0 ustar 00root root 0000000 0000000 var 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 currentParent = obj;
var ancestors = [];
function startElement(name, attrs) {
if (! (name in currentParent)) {
currentParent[name] = attrs;
} else if (!(currentParent[name] instanceof Array)) {
// Put the existing object in an array.
var newArray = [currentParent[name]];
// Add the new object to the array.
newArray.push(attrs);
// Point to the new array.
currentParent[name] = newArray;
} else {
// An array already exists, push the attributes on to it.
currentParent[name].push(attrs);
}
// Store the current (old) parent.
ancestors.push(currentParent);
// We are now working with this object, so it becomes the current parent.
if (currentParent[name] instanceof Array) {
// If it is an array, get the last element of the array.
currentParent = currentParent[name][currentParent[name].length - 1];
} else {
// Otherwise, use the object itself.
currentParent = currentParent[name];
}
}
function charData(data) {
data = data.trim();
if (!data.length) {
return;
}
currentParent['$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 ((Object.keys(currentParent).length == 1) && ('$t' in currentParent)) {
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] = currentParent['$t'];
}
} else {
//console.log("final " + name + ":");
//console.log(currentParent);
}
currentParent = ancestor;
}
parser.on('startElement', startElement);
parser.on('text', charData);
parser.on('endElement', endElement);
module.exports.toJson = function(xml, _object) {
_object = _object || false;
if(parser.parse(xml)) {
if(_object) {
return obj;
}
return JSON.stringify(obj);
}
};
package.json 0000664 0000000 0000000 00000000657 15162512155 0013357 0 ustar 00root root 0000000 0000000 { "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/ 0000775 0000000 0000000 00000000000 15162512155 0012040 5 ustar 00root root 0000000 0000000 test/fixtures/ 0000775 0000000 0000000 00000000000 15162512155 0013711 5 ustar 00root root 0000000 0000000 test/fixtures/domain.json 0000664 0000000 0000000 00000001260 15162512155 0016052 0 ustar 00root root 0000000 0000000 {"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.xml 0000664 0000000 0000000 00000001470 15162512155 0015704 0 ustar 00root root 0000000 0000000
QEmu-fedora-i686
c7a5fdbd-cdaf-9455-926a-d65c16db1809
219200
219200
2
hvm
/usr/bin/qemu-system-x86_64
cosa1
cosa2
cosa3
test/test.js 0000664 0000000 0000000 00000001732 15162512155 0013360 0 ustar 00root root 0000000 0000000 var 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!');
}
}
});