Trabalho com XML em C++: visão geral das bibliotecas para parsing e criação de documentos XML
XML (Extensible Markup Language) continua sendo um formato popular para armazenar e transmitir dados estruturados, especialmente em arquivos de configuração, serviços web (SOAP, XML-RPC) e troca de dados entre sistemas. Em C++, não há suporte nativo a XML (exceto pelo obsoleto MSXML), portanto, os desenvolvedores recorrem a bibliotecas de terceiros. Neste artigo, abordaremos as três bibliotecas mais populares e leves para trabalhar com XML em C++: TinyXML-2, PugiXML e RapidXML. Você aprenderá como instalar cada uma delas, como fazer parsing e criar documentos XML, além de comparar seu desempenho e facilidade de uso.
1. TinyXML-2
TinyXML-2 é uma biblioteca simples e minimalista, composta por apenas dois arquivos (tinyxml2.h e tinyxml2.cpp). É ideal para projetos pequenos, onde não é necessário alto desempenho, mas a simplicidade de integração é importante. A biblioteca é licenciada sob Zlib, permitindo seu uso livre em projetos comerciais.
Instalação
Copie os arquivos tinyxml2.h e tinyxml2.cpp do repositório oficial para o seu projeto e inclua-os. Nenhuma dependência adicional é necessária.
Exemplo: leitura de XML
#include "tinyxml2.h"#include <iostream>
int main() { tinyxml2::XMLDocument doc; doc.LoadFile("config.xml");
tinyxml2::XMLElement* root = doc.RootElement(); if (root) { const char* value = root->FirstChildElement("setting")->GetText(); std::cout << "Setting: " << value << std::endl; } return 0;}Exemplo: criação de XML
#include "tinyxml2.h"
int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLDeclaration* decl = doc.NewDeclaration(); doc.InsertFirstChild(decl);
tinyxml2::XMLElement* root = doc.NewElement("root"); root->SetAttribute("version", "1.0"); doc.InsertEndChild(root);
tinyxml2::XMLElement* child = doc.NewElement("item"); child->SetText("Hello, XML!"); root->InsertEndChild(child);
doc.SaveFile("output.xml"); return 0;}2. PugiXML
PugiXML é uma biblioteca mais rápida e funcional que o TinyXML-2. Ela suporta XPath, trabalha com codificações UTF-8/16 e possui uma API conveniente. O PugiXML é frequentemente usado em projetos que exigem um equilíbrio entre velocidade e facilidade de uso. É distribuído sob a licença MIT.
Instalação
Baixe os arquivos fonte do GitHub e adicione pugixml.cpp e pugixml.hpp ao projeto. Para usar XPath, adicione PUGIXML_HAS_XPATH nas definições do pré-processador.
Exemplo: leitura de XML com XPath
#include "pugixml.hpp"#include <iostream>
int main() { pugi::xml_document doc; doc.load_file("data.xml");
pugi::xpath_node result = doc.select_node("//item[@id='1']"); if (result) { std::cout << "Found: " << result.node().child_value() << std::endl; } return 0;}Exemplo: criação de XML
#include "pugixml.hpp"
int main() { pugi::xml_document doc; pugi::xml_node root = doc.append_child("configuration"); root.append_attribute("version") = "2.0";
pugi::xml_node param = root.append_child("param"); param.append_attribute("name") = "timeout"; param.text().set("30");
doc.save_file("config.xml"); return 0;}3. RapidXML
RapidXML é a biblioteca mais rápida para parsing de XML em C++. Ela trabalha in-place (modifica o original