Trabalhando com XML em C++: bibliotecas pugixml, TinyXML-2 e RapidXML

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalhando com XML em C++: escolhendo uma biblioteca para parsing e criação de documentos



XML (eXtensible Markup Language) continua sendo um dos principais formatos para armazenamento e transmissão de dados estruturados. Em C++, não há suporte embutido para XML (exceto o obsoleto MSXML), portanto, os desenvolvedores utilizam bibliotecas de terceiros. Neste artigo, analisaremos as três bibliotecas leves mais populares: pugixml, TinyXML-2 e RapidXML. Todas funcionam sem dependências externas, suportam UTF-8 e são adequadas para sistemas embarcados.



1. pugixml — a escolha universal



pugixml é a biblioteca mais rápida e funcional entre as soluções "leves". Ela suporta XPath, processamento em fluxo e uma API conveniente no estilo STL.



Instalação: basta copiar pugixml.hpp e pugixml.cpp para o projeto.



Exemplo: parsing e leitura 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 << "Erro: " << result.description() << std::endl; return 1; }

// Obtém o elemento raiz pugi::xml_node root = doc.child("configuration");

// Percorre todos os 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;}


Criação de 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("Exemplo");item.append_child("price").text().set(99.99);

doc.save_file("output.xml");


Características:

  • Suporte a XPath 1.0 para consultas complexas.
  • Trabalho com codificações UTF-8/16/32.
  • Modo de parsing "preguiçoso" para arquivos grandes.


2. TinyXML-2 — simplicidade e confiabilidade



TinyXML-2 é o sucessor do clássico TinyXML, otimizado para memória. É ideal para projetos simples onde não é necessário XPath.



Instalação: dois arquivos: tinyxml2.h e tinyxml2.cpp.



Exemplo: leitura 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 << "Erro ao carregar: " << 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 << "Livro: " << title << ", páginas: " << pages << std::endl; }

return 0;}


Criação 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("Notebook");root->InsertEndChild(product);

doc.SaveFile("catalog.xml");


Vantagens:

  • Consumo mínimo de memória (sem cópia de strings).
  • API simples e intuitiva.
  • Suporte a comentários XML e CDATA.


3.

Recommendations