Travailler avec XML en C++ : bibliothèques PugiXML et RapidXML
XML (Extensible Markup Language) reste l'un des formats clés pour le stockage et la transmission de données structurées. En C++, il existe plusieurs bibliothèques puissantes pour travailler avec XML, parmi lesquelles se distinguent PugiXML (légère, avec support XPath) et RapidXML (extrêmement rapide, fonctionnant « sur place »). Dans cet article, nous analyserons les deux bibliothèques, leurs caractéristiques, leur installation et des exemples pratiques.
1. PugiXML — un outil universel
PugiXML est une bibliothèque légère et multiplateforme avec support de XPath 1.0 et des encodages UTF-8/UTF-16. Elle est idéale pour la plupart des tâches : de la lecture de fichiers de configuration à l'analyse complexe de documents XML.
Installation
Téléchargez les fichiers d'en-tête depuis le site officiel ou utilisez un gestionnaire de paquets (vcpkg, Conan). Incluez dans le projet :
#include "pugixml.hpp"using namespace pugi;Exemple : chargement et lecture de XML
#include <iostream>#include "pugixml.hpp"
int main() { xml_document doc; if (!doc.load_file("config.xml")) { std::cerr << "Erreur de chargement du fichier"; return -1; }
// Obtention de l'élément racine 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 << "Paramètre : " << name << " = " << value << ""; } return 0;}Exemple : création d'un document 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() = ("Produit " + std::to_string(i)).c_str(); item.append_child("price").text() = 100.0 * i;}doc.save_file("catalog.xml");Avantages de PugiXML :
- Support de XPath pour les requêtes complexes (par exemple,
doc.select_nodes("//item[@id>1]")). - Gestion des encodages et Unicode.
- Documentation détaillée et communauté active.
2. RapidXML — vitesse et minimalisme
RapidXML est une bibliothèque header-only qui analyse XML sans copie de données (in-place). Elle est nettement plus rapide que PugiXML, mais ne supporte pas XPath et nécessite une attention particulière à la durée de vie des chaînes.
Installation
Copiez rapidxml.hpp et les fichiers supplémentaires (rapidxml_utils.hpp, rapidxml_print.hpp) dans le projet.
Exemple : analyse d'une chaîne
#include <iostream>#include "rapidxml.hpp"
int main() { char xml[] = "<root><item id='1'>Valeur</item></root>"; rapidxml::xml_document<> doc; doc.parse<0>(xml); // 0 — indicateurs d'analyse
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 << "Contenu : " << item->value() << ""; } return 0;}Exemple : création 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);
// Sortie vers une chaînestd::string result;rapidxml::print(std::back_inserter(result), doc);std::cout << result;Important :
Aussi dans la bibliothèque
Métriques Prometheus en Rust : bibliothèques prometheus et metrics-exporter-prometheus
Tests en JavaScript (Node.js) : frameworks et outils
ORM pour Java : comparaison de Hibernate, MyBatis, JPA et Spring Data
Planificateur de tâches Java : Quartz Scheduler – guide complet
SpriteKit Swift : guide complet avec exemples