Trabalho com XML em C++: bibliotecas PugiXML e RapidXML
XML (Extensible Markup Language) continua sendo um dos principais formatos para armazenamento e transmissão de dados estruturados. Em C++, existem várias bibliotecas poderosas para trabalhar com XML, entre as quais se destacam PugiXML (leve, com suporte a XPath) e RapidXML (extremamente rápida, operando "in-place"). Neste artigo, abordaremos ambas as bibliotecas, suas características, instalação e exemplos práticos.
1. PugiXML — ferramenta universal
PugiXML é uma biblioteca leve, multiplataforma, com suporte a XPath 1.0 e codificações UTF-8/UTF-16. Ela é ideal para a maioria das tarefas: desde a leitura de arquivos de configuração até a análise complexa de documentos XML.
Instalação
Baixe os arquivos de cabeçalho do site oficial ou use um gerenciador de pacotes (vcpkg, Conan). Inclua no projeto:
#include "pugixml.hpp"using namespace pugi;Exemplo: carregar e ler XML
#include <iostream>#include "pugixml.hpp"
int main() { xml_document doc; if (!doc.load_file("config.xml")) { std::cerr << "Erro ao carregar o arquivo"; return -1; }
// Obtém o elemento raiz 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;}Exemplo: criação de 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() = ("Produto " + std::to_string(i)).c_str(); item.append_child("price").text() = 100.0 * i;}doc.save_file("catalog.xml");Vantagens do PugiXML:
- Suporte a XPath para consultas complexas (ex.:
doc.select_nodes("//item[@id>1]")). - Trabalho com codificações e Unicode.
- Documentação detalhada e comunidade ativa.
2. RapidXML — velocidade e minimalismo
RapidXML é uma biblioteca header-only que faz parsing de XML sem copiar dados (in-place). Ela é significativamente mais rápida que PugiXML, mas não suporta XPath e requer cuidado com o tempo de vida das strings.
Instalação
Copie rapidxml.hpp e os arquivos adicionais (rapidxml_utils.hpp, rapidxml_print.hpp) para o projeto.
Exemplo: parsing de string
#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 — flags de parsing
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 << "Conteúdo: " << item->value() << ""; } return 0;}Exemplo: criação de 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);
// Saída para stringstd::string result;rapidxml::print(std::back_inserter(result), doc);std::cout << result;Importante:
Também na biblioteca
Aprendizado de Máquina em Kotlin: visão geral das bibliotecas KMath, Smile, KotlinDL e DeepLearning4J
Trabalhando com Excel em Rust: bibliotecas para leitura e escrita
Trabalhando com Kafka em Rust: bibliotecas e exemplos para iniciantes
Biblioteca WebSocket para C# (.NET): SignalR e alternativas
Biblioteca Padrão JavaScript (Node.js): Visão Geral Completa