Trabajo con XML en C++: bibliotecas pugixml, TinyXML-2 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++: eligiendo una biblioteca para analizar y crear documentos



XML (eXtensible Markup Language) sigue siendo uno de los formatos clave para almacenar y transmitir datos estructurados. En C++ no hay soporte integrado para XML (excepto el obsoleto MSXML), por lo que los desarrolladores utilizan bibliotecas de terceros. En este artículo analizaremos las tres bibliotecas ligeras más populares: pugixml, TinyXML-2 y RapidXML. Todas funcionan sin dependencias externas, soportan UTF-8 y son adecuadas para sistemas embebidos.



1. pugixml — la opción universal



pugixml es la biblioteca más rápida y funcional entre las soluciones "ligeras". Soporta XPath, procesamiento por flujo y una API conveniente al estilo STL.



Instalación: basta con copiar pugixml.hpp y pugixml.cpp en el proyecto.



Ejemplo: análisis y lectura de XML

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

int main() { pugi::xml_document doc; pugi::xml_parse_result result = doc.load_file("config.xml");

if (!result) { std::cerr << "Error: " << result.description() << std::endl; return 1; }

// Obtenemos el elemento raíz pugi::xml_node root = doc.child("configuration");

// Recorremos todos los elementos <parameter> for (pugi::xml_node param : root.children("parameter")) { std::string name = param.attribute("name").value(); std::string value = param.child_value("value"); std::cout << name << " = " << value << std::endl; }

return 0;}


Creación de un documento XML

pugi::xml_document doc;pugi::xml_node root = doc.append_child("root");root.append_attribute("version") = "1.0";

pugi::xml_node item = root.append_child("item");item.append_attribute("id") = 1;item.append_child("name").text().set("Ejemplo");item.append_child("price").text().set(99.99);

doc.save_file("output.xml");


Características:

  • Soporte de XPath 1.0 para consultas complejas.
  • Trabajo con codificaciones UTF-8/16/32.
  • Modo de análisis "perezoso" para archivos grandes.


2. TinyXML-2 — simplicidad y fiabilidad



TinyXML-2 es el sucesor del clásico TinyXML, optimizado en memoria. Es ideal para proyectos sencillos donde no se necesita XPath.



Instalación: dos archivos: tinyxml2.h y tinyxml2.cpp.



Ejemplo: lectura de atributos

#include "tinyxml2.h"#include <iostream>

int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLError err = doc.LoadFile("data.xml");

if (err != tinyxml2::XML_SUCCESS) { std::cerr << "Error de carga: " << doc.ErrorStr() << std::endl; return 1; }

tinyxml2::XMLElement* element = doc.FirstChildElement("book"); if (element) { const char* title = element->Attribute("title"); int pages = element->IntAttribute("pages"); std::cout << "Libro: " << title << ", páginas: " << pages << std::endl; }

return 0;}


Creación de XML

tinyxml2::XMLDocument doc;tinyxml2::XMLDeclaration* decl = doc.NewDeclaration();doc.InsertFirstChild(decl);

tinyxml2::XMLElement* root = doc.NewElement("catalog");doc.InsertEndChild(root);

tinyxml2::XMLElement* product = doc.NewElement("product");product->SetAttribute("id", 101);product->SetText("Portátil");root->InsertEndChild(product);

doc.SaveFile("catalog.xml");


Ventajas:

  • Consumo mínimo de memoria (sin copia de cadenas).
  • API simple e intuitiva.
  • Soporte de comentarios XML y CDATA.


3.

Recommendations