Expressjs response as JSON and Xml

express, json, node-mysql, node.js, xml

Solution

So I've looked around for a better object-to-XML mapper for you. I tried three before I found one that I liked (it's easy-to-use, and it makes sense for your application). Ditch the old one, and use object-to-xml instead:

var o2x = require('object-to-xml');

response.set('Content-Type', 'text/xml');
response.send(o2x({
    '?xml version="1.0" encoding="utf-8"?' : null,
    restaurants: {
        restaurant: name_of_restaurants
    }
}));

Problem

What i am doing:: I am trying to generate json and xml output for a dataset from database Express Code:: Here i am trying for JSON response ``` var express = require('express') , async = require('async') , http = require('http') , mysql = require('mysql'); var xml = require('xml'); var app = express(); var connection = mysql.createConnection({ host: 'localhost', user: 'root', database: 'MyDatabase' }); connection.connect(); // all environments app.set('port', process.env.PORT || 3007); app.use(express.static(__dirname + '/public/images')); app.get('/Result/',function(request,response){ var name_of_restaurants; async.series( [ // Get the first table contents function ( callback ) { connection.query('SELECT * FROM mas_buf_type', function(err, rows, fields) { console.log('Connection result error '+err); name_of_restaurants = rows; callback(); }); } // Send the response ], function ( error, results ) { response.json({'restaurants' : name_of_restaurants }); //response.set('Content-Type', 'text/xml'); //response.send(xml(name_of_restaurants)); } ); } ); http.createServer(app).listen(app.get('port'),function(){ console.log('Express server listening on port'+app.get('port')); }); ``` My Output:: ``` { "restaurants": [ { "Buf_Type_Id": 1, "Buf_Type_Name": "Breakfast" }, { "Buf_Type_Id": 2, "Buf_Type_Name": "Lunch" }, { "Buf_Type_Id": 3, "Buf_Type_Name": "Dinner" } ] } ``` Now instead of ``` response.json({'restaurants' : name_of_restaurants }); ``` I have added these lines to get `XML` output ``` response.set('Content-Type', 'text/xml'); response.send(xml(name_of_restaurants)); ``` Output:: ``` <Buf_Type_Id>1</Buf_Type_Id> <Buf_Type_Id>2</Buf_Type_Id> <Buf_Type_Id>3</Buf_Type_Id> ``` My QUESTION:: - Clearly you can see both output are different and i cannot find second column in xml output - how to resolve this - what changes should i need to make {EDIT} ``` var express = require('express') , async = require('async') , http = require('http') , mysql = require('mysql'); var xml = require('xml'); var app = express(); var connection = mysql.createConnection({ host: 'localhost', user: 'root', database: 'findmybuffet' }); connection.connect(); // all environments app.set('port', process.env.PORT || 3007); app.use(express.static(__dirname + '/public/images')); app.get('/Result/',function(request,response){ var name_of_restaurants; async.series( [ // Get the first table contents function ( callback ) { connection.query('SELECT * FROM mas_buf_type', function(err, rows, fields) { console.log('Connection result error '+err); name_of_restaurants = rows; callback(); }); } // Send the response ], function ( error, results ) { //response.json({'restaurants' : name_of_restaurants }); response.set('Content-Type', 'text/xml'); //response.send(xml(name_of_restaurants)); response.send(xml({restaurants:[ name_of_restaurants.map(function(r){ return [ { Buf_Type_Id: r.Buf_Type_Id }, { Buf_Type_Name: r.Buf_Type_Name }, ] }) ]})); } ); } ); http.createServer(app).listen(app.get('port'),function(){ console.log('Express server listening on port'+app.get('port')); }); ``` Output:: ``` <restaurants> <0> <Buf_Type_Id>1</Buf_Type_Id> <Buf_Type_Name>Breakfast</Buf_Type_Name> </0> </restaurants> ``` Also clearly we can see `<0>` getting generated .... which is not required ...how to remove this ?

Original source