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.