Since XML is still continued to be used as a data exchange format, mostly in enterprise applications, knowing how to manipulate the contents of an XML file programmatically can be very useful. Rather than manually editing hundreds of lines of XML, you can easily write a small script in Node.js that makes the changes in no time.

In an earlier article, we looked at how to convert an XML file to a JSON object in Node.js by using the open-source xml2js module. Today, you'll learn how to edit an XML file with Node.js.

Basic Setup

First of all, add the xml2js module to your Node.js application by typing the following command in your terminal:

$ node install xml2js --save

Next, create a new JavaScript file called index.js with the following content:

index.js

const fs = require("fs");

// read XML file
fs.readFile("databases.xml", "utf-8", (err, data) => {
    if (err) {
        throw err;
    }
    console.log(data);
});

The above code reads an XML file from the disk and prints it on the console. Here is an example of an XML file that needs to be updated:

databases.xml

<?xml version="1.0" encoding="UTF-8" ?>
<databases>
    <database>
        <name>MySQL</name>
        <type>RDBMS</type>
    </database>
    <database>
        <name>MongoDB</name>
        <type>NoSQL</type>
    </database>
    <database>
        <name>Neo4j</name>
        <type>Graph DB</type>
    </database>
</databases>

Convert XML to JSON

Since we are now able to read the XML file into a string, we can easily convert it into a JSON object by using the xml2js.parseString() method.

Let us update the above example code to include XML parsing to JSON:

const fs = require("fs");
const xml2js = require('xml2js');

// read XML file
fs.readFile("databases.xml", "utf-8", (err, data) => {
    if (err) {
        throw err;
    }

    // convert XML data to JSON object
    xml2js.parseString(data, (err, result) => {
        if (err) {
            throw err;
        }

        // print JSON object
        console.log(JSON.stringify(result, null, 4));

    });
});

If you run the above code, you should see the following JSON object printed out on the console:

{
    "databases": {
        "database": [
            {
                "name": [
                    "MySQL"
                ],
                "type": [
                    "RDBMS"
                ]
            },
            {
                "name": [
                    "MongoDB"
                ],
                "type": [
                    "NoSQL"
                ]
            },
            {
                "name": [
                    "Neo4j"
                ],
                "type": [
                    "Graph DB"
                ]
            }
        ]
    }
}

Editing the XML

Editing a JSON object in JavaScript is incredibly straightforward. Let us replace the Neo4j database with another graph database called ArangoDB:

// replace `Neo4j` with `ArangoDB`
result.databases.database[2].name = 'ArangoDB';

You can also add a new database to already existing databases list:

// add a new database to list
const postgres = {
    name: 'PostgreSQL',
    type: 'RDBMS'
};

result.databases.database.push(postgres);

After the above modifications, our updated example code looks like below:

const fs = require("fs");
const xml2js = require('xml2js');

// read XML file
fs.readFile("databases.xml", "utf-8", (err, data) => {
    if (err) {
        throw err;
    }

    // convert XML data to JSON object
    xml2js.parseString(data, (err, result) => {
        if (err) {
            throw err;
        }

        // replace `Neo4j` with `ArangoDB`
        result.databases.database[2].name = 'ArangoDB';

        // add a new database to list
        const postgres = {
            name: 'PostgreSQL',
            type: 'RDBMS'
        };

        result.databases.database.push(postgres);

        // print JSON object
        console.log(JSON.stringify(result, null, 4));

    });
});

Convert JSON to XML

Now that we have successfully modified our JSON object, we can convert it back to an XML string and finally write it to a file:

const fs = require("fs");
const xml2js = require('xml2js');

// read XML file
fs.readFile("databases.xml", "utf-8", (err, data) => {
    if (err) {
        throw err;
    }

    // convert XML data to JSON object
    xml2js.parseString(data, (err, result) => {
        if (err) {
            throw err;
        }

        // replace `Neo4j` with `ArangoDB`
        result.databases.database[2].name = 'ArangoDB';

        // add a new database to list
        const postgres = {
            name: 'PostgreSQL',
            type: 'RDBMS'
        };

        result.databases.database.push(postgres);

        // convert SJON objec to XML
        const builder = new xml2js.Builder();
        const xml = builder.buildObject(result);

        // write updated XML string to a file
        fs.writeFile('new-databases.xml', xml, (err) => {
            if (err) {
                throw err;
            }

            console.log(`Updated XML is written to a new file.`);
        });

    });
});

That's it. Run the above code and you should see a new XML file generated with the updated XML within the same directory as your Node.js script file exists.

Read Next: How to convert XML to JSON in Node.js

✌️ Like this article? Follow me on Twitter and LinkedIn. You can also Subscribe to RSS Feed.

Last Updated: