Last week, I wrote an article on how to convert a JSON array into a CSV file in a Node.js application. Today, we'll look at how to parse an XML file or a string to a JSON object.
To perform the XML to JSON conversion, we'll be using the xml2js module from Node Package Manager (NPM). This package provides a convenient API that does all the heavy lifting for us.
Create an Application
Let us first create a new Node.js application and install all the required dependencies. Switch to the folder where you want to create your project and run the following command in the terminal:
$ npm init -y
The above command will create a package.json
file in the root directory. Next, install the only required dependency — xml2js
by executing the following command:
$ npm install xml2js --save
This will create a node_modules
directory inside your project that will contain all the dependencies required by the xml2js
module.
Convert XML to JSON
To convert an XML string to a JSON object, first create a new JavaScript file named app.js
in your project root directory:
$ touch app.js
If the touch
command is not available, just create the file manually. Open the app.js
file in your favorite editor and add the following code:
app.js
const xml2js = require('xml2js');
// XML string to be parsed to JSON
const xml = `<?xml version="1.0" encoding="UTF-8" ?>
<user id="1">
<name>John Doe</name>
<email>john.doe@example.com</email>
<roles>
<role>Member</role>
<role>Admin</role>
</roles>
<admin>true</admin>
</user>`;
// convert XML to JSON
xml2js.parseString(xml, (err, result) => {
if(err) {
throw err;
}
// `result` is a JavaScript object
// convert it to a JSON string
const json = JSON.stringify(result, null, 4);
// log JSON string
console.log(json);
});
That above example code parses an XML string and converts it into a JavaScript object. To convert the JavaScript object into its JSON representation, we are using the JSON.stringify() method.
To see the output, type the following command to launch the Node.js application:
$ node app.js
If everything goes right, you should see the following JSON printed on the console:
{
"user": {
"$": {
"id": "1"
},
"name": [
"John Doe"
],
"email": [
"john.doe@example.com"
],
"roles": [
{
"role": [
"Member",
"Admin"
]
}
],
"admin": [
"true"
]
}
}
The above JSON response looks different than what we usually see when dealing with JSON objects. All the XML string elements are turned into JSON arrays. It is a bit different than what I was expecting i.e. "name": "John Doe"
instead of "name": ["John Doe"]
, but it is XML after all.
The xml2js
package provides several options that you can pass as second argument to further customize the output. For example, you can set mergeAttrs: true
to merge attributes and child elements as properties of the parent, instead of keying attributes off a child attribute object:
xml2js.parseString(xml, { mergeAttrs: true }, (err, result) => {
// ...
});
Here is how the JSON output looks now:
{
"user": {
"id": [
"1"
],
"name": [
"John Doe"
],
// ...
}
}
As you can see above, id
is now merged with the user
object and the special $
attribute is removed.
Write JSON to File
To write the output JSON string to a file for further processing, you can use the following JavaScript code:
xml2js.parseString(xml, { mergeAttrs: true }, (err, result) => {
if (err) {
throw err;
}
// `result` is a JavaScript object
// convert it to a JSON string
const json = JSON.stringify(result, null, 4);
// save JSON in a file
fs.writeFileSync('user.json', json);
});
Take a look at this guide to learn more about writing JSON to a file in Node.js.
Read XML from File
If your XML data is stored in a file, you can read it by using the native fs
module and then perform the conversion as shown below:
app-file.js
const xml2js = require('xml2js');
const fs = require('fs');
// read XML from a file
const xml = fs.readFileSync('user.xml');
// convert XML to JSON
xml2js.parseString(xml, { mergeAttrs: true }, (err, result) => {
if (err) {
throw err;
}
// `result` is a JavaScript object
// convert it to a JSON string
const json = JSON.stringify(result, null, 4);
// save JSON in a file
fs.writeFileSync('user.json', json);
});
Take a look at this guide to learn more about reading and writing files in a Node.js application.
JavaScript Promises
Want to use promises instead of the callback? The xml2js
module provides a special method called parseStringPromise()
that returns a promise as shown below:
app-promise.js
const xml2js = require('xml2js');
const fs = require('fs');
// read XML from a file
const xml = fs.readFileSync('user.xml');
// convert XML to JSON
xml2js.parseStringPromise(xml, { mergeAttrs: true })
.then(result => {
// convert it to a JSON string
const json = JSON.stringify(result, null, 4);
// save JSON in a file
fs.writeFileSync('user.json', json);
}).catch(err => console.log(err));
Async-Await
The xml2js
module also supports async-await syntax as shown in the following example:
app-async.js
const xml2js = require('xml2js');
const fs = require('fs');
// read XML from a file
const xml = fs.readFileSync('user.xml');
// convert XML to JSON
(async () => {
try {
const result = await xml2js.parseStringPromise(xml, { mergeAttrs: true });
// convert it to a JSON string
const json = JSON.stringify(result, null, 4);
// save JSON in a file
fs.writeFileSync('user.json', json);
} catch (err) {
console.log(err);
}
})();
Source Code: Download the complete source code from GitHub available under MIT license.
Conclusion
That's all folks! In this article, we looked at several examples to learn how to complete XML to JSON conversion in a Node.js application by using the xml2js
package.
Take a look at xml2js
module's documentation to learn about all the available methods and properties.
Read Next: How to edit an XML file with Node.js
✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.