Travailler avec XML en C++ : bibliothèques PugiXML et RapidXML

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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 :

Recommendations