Trabajo con XML en C++: bibliotecas PugiXML y RapidXML

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con XML en C++: bibliotecas PugiXML y RapidXML



XML (Extensible Markup Language) sigue siendo uno de los formatos clave para almacenar y transmitir datos estructurados. En C++, existen varias bibliotecas potentes para trabajar con XML, entre las que destacan PugiXML (ligera, con soporte XPath) y RapidXML (extremadamente rápida, que trabaja "in situ"). En este artículo, analizaremos ambas bibliotecas, sus características, instalación y ejemplos prácticos.



1. PugiXML — una herramienta universal



PugiXML es una biblioteca ligera y multiplataforma con soporte para XPath 1.0 y codificaciones UTF-8/UTF-16. Es ideal para la mayoría de las tareas: desde la lectura de archivos de configuración hasta el análisis complejo de documentos XML.



Instalación

Descargue los archivos de encabezado desde el sitio oficial o use un gestor de paquetes (vcpkg, Conan). Inclúyalos en el proyecto:

#include "pugixml.hpp"using namespace pugi;


Ejemplo: cargar y leer XML

#include <iostream>#include "pugixml.hpp"

int main() { xml_document doc; if (!doc.load_file("config.xml")) { std::cerr << "Error al cargar el archivo"; return -1; }

// Obtener el elemento raíz xml_node root = doc.child("settings"); for (xml_node node = root.child("param"); node; node = node.next_sibling("param")) { std::string name = node.attribute("name").as_string(); int value = node.attribute("value").as_int(); std::cout << "Parámetro: " << name << " = " << value << ""; } return 0;}


Ejemplo: crear un documento XML

xml_document doc;xml_node root = doc.append_child("catalog");for (int i = 1; i <= 3; ++i) {    xml_node item = root.append_child("item");    item.append_attribute("id") = i;    item.append_child("name").text() = ("Producto " + std::to_string(i)).c_str();    item.append_child("price").text() = 100.0 * i;}doc.save_file("catalog.xml");


Ventajas de PugiXML:

  • Soporte XPath para consultas complejas (por ejemplo, doc.select_nodes("//item[@id>1]")).
  • Trabajo con codificaciones y Unicode.
  • Documentación detallada y comunidad activa.


2. RapidXML — velocidad y minimalismo



RapidXML es una biblioteca header-only que analiza XML sin copiar datos (in-place). Funciona significativamente más rápido que PugiXML, pero no admite XPath y requiere cuidado con la vida útil de las cadenas.



Instalación

Copie rapidxml.hpp y los archivos adicionales (rapidxml_utils.hpp, rapidxml_print.hpp) en el proyecto.



Ejemplo: analizar una cadena

#include <iostream>#include "rapidxml.hpp"

int main() { char xml[] = "<root><item id='1'>Valor</item></root>"; rapidxml::xml_document<> doc; doc.parse<0>(xml); // 0 — banderas de análisis

rapidxml::xml_node<>* root = doc.first_node("root"); rapidxml::xml_node<>* item = root->first_node("item"); if (item) { std::cout << "ID: " << item->first_attribute("id")->value() << ""; std::cout << "Contenido: " << item->value() << ""; } return 0;}


Ejemplo: crear XML

rapidxml::xml_document<> doc;rapidxml::xml_node<>* root = doc.allocate_node(rapidxml::node_element, "data");doc.append_node(root);

rapidxml::xml_node<>* child = doc.allocate_node(rapidxml::node_element, "value", "42");root->append_node(child);

// Salida a cadenastd::string result;rapidxml::print(std::back_inserter(result), doc);std::cout << result;


Importante:

Recommendations