Try it yourself with our free Xml Formatter tool — runs entirely in your browser, no signup needed.

How to Convert XML to JSON in C++

How to convert XML to JSON in C++

Converting XML to JSON is a common task in software development, particularly when working with data exchange formats or integrating with web services. XML (Extensible Markup Language) is a markup language used for storing and transporting data, while JSON (JavaScript Object Notation) is a lightweight data interchange format. In this article, we will explore how to convert XML to JSON in C++ using the popular pugixml and jsoncpp libraries.

Quick Example

#include <pugixml.hpp>
#include <json/json.h>

int main() {
    // XML input
    std::string xml = "<root><name>John</name><age>30</age></root>";

    // Parse XML
    pugi::xml_document doc;
    doc.load_string(xml.c_str());

    // Convert XML to JSON
    Json::Value json;
    json["name"] = doc.child("root").child("name").child_value();
    json["age"] = doc.child("root").child("age").child_value();

    // Print JSON
    Json::StyledWriter writer;
    std::cout << writer.write(json) << std::endl;

    return 0;
}

This code example assumes you have the pugixml and jsoncpp libraries installed. You can install them using the following commands:

sudo apt-get install libpugixml-dev
sudo apt-get install libjsoncpp-dev

Step-by-Step Breakdown

Include necessary libraries

#include <pugixml.hpp>
#include <json/json.h>

We include the pugixml library for parsing XML and the jsoncpp library for working with JSON.

Parse XML

pugi::xml_document doc;
doc.load_string(xml.c_str());

We create an instance of pugi::xml_document and load the XML string using the load_string method.

Convert XML to JSON

Json::Value json;
json["name"] = doc.child("root").child("name").child_value();
json["age"] = doc.child("root").child("age").child_value();

We create an instance of Json::Value and populate it with values from the parsed XML document. We use the child method to navigate the XML tree and the child_value method to get the text value of an element.

Print JSON

Json::StyledWriter writer;
std::cout << writer.write(json) << std::endl;

We create an instance of Json::StyledWriter and use it to write the JSON value to a string, which we then print to the console.

Handling Edge Cases

Empty/null input

if (xml.empty()) {
    // Handle empty input
    std::cerr << "Error: empty input" << std::endl;
    return 1;
}

We check if the input XML string is empty and handle it accordingly.

Invalid input

if (!doc.load_string(xml.c_str())) {
    // Handle invalid input
    std::cerr << "Error: invalid input" << std::endl;
    return 1;
}

We check if the input XML string is invalid and handle it accordingly.

Large input

// Enable large input support
pugi::xml_document doc;
doc.load_string(xml.c_str(), pugi::parse_default | pugi::parse_trim_pcdata);

We enable large input support by passing the parse_trim_pcdata flag to the load_string method.

Unicode/special characters

// Enable Unicode support
pugi::xml_document doc;
doc.load_string(xml.c_str(), pugi::parse_default | pugi::parse_w3c);

We enable Unicode support by passing the parse_w3c flag to the load_string method.

Common Mistakes

Mistake 1: Not checking for empty input

// WRONG
pugi::xml_document doc;
doc.load_string(xml.c_str());

// CORRECT
if (xml.empty()) {
    // Handle empty input
    std::cerr << "Error: empty input" << std::endl;
    return 1;
}
pugi::xml_document doc;
doc.load_string(xml.c_str());

Not checking for empty input can lead to unexpected behavior.

Mistake 2: Not handling invalid input

// WRONG
pugi::xml_document doc;
doc.load_string(xml.c_str());

// CORRECT
if (!doc.load_string(xml.c_str())) {
    // Handle invalid input
    std::cerr << "Error: invalid input" << std::endl;
    return 1;
}

Not handling invalid input can lead to unexpected behavior.

Mistake 3: Not using Unicode support

// WRONG
pugi::xml_document doc;
doc.load_string(xml.c_str());

// CORRECT
pugi::xml_document doc;
doc.load_string(xml.c_str(), pugi::parse_default | pugi::parse_w3c);

Not using Unicode support can lead to incorrect parsing of Unicode characters.

Performance Tips

Tip 1: Use parse_trim_pcdata flag

pugi::xml_document doc;
doc.load_string(xml.c_str(), pugi::parse_default | pugi::parse_trim_pcdata);

Using the parse_trim_pcdata flag can improve performance by reducing memory usage.

Tip 2: Use parse_w3c flag

pugi::xml_document doc;
doc.load_string(xml.c_str(), pugi::parse_default | pugi::parse_w3c);

Using the parse_w3c flag can improve performance by enabling Unicode support.

Tip 3: Use Json::FastWriter instead of Json::StyledWriter

Json::FastWriter writer;
std::cout << writer.write(json) << std::endl;

Using Json::FastWriter can improve performance by reducing the amount of formatting done on the JSON output.

FAQ

Q: What is the difference between pugixml and jsoncpp?

A: pugixml is a lightweight XML parsing library, while jsoncpp is a library for working with JSON data.

Q: How do I handle large input XML files?

A: You can enable large input support by passing the parse_trim_pcdata flag to the load_string method.

Q: How do I handle Unicode characters in XML input?

A: You can enable Unicode support by passing the parse_w3c flag to the load_string method.

Q: What is the difference between Json::StyledWriter and Json::FastWriter?

A: Json::StyledWriter produces formatted JSON output, while Json::FastWriter produces compact JSON output.

Q: Can I use this code with other XML parsing libraries?

A: No, this code is specifically designed to work with pugixml.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp