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 xml-js --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 @attacomsian on Twitter. You can also follow me on LinkedIn and DEV. Subscribe to RSS Feed.

👋 If you enjoy reading my articles and want to support me to continue creating free tutorials, Buy me a coffee (cost $5) .

Need help to launch a new product? I am available for contract work. Hire me to accomplish your business goals with engineering and design.