Travailler avec XML en C++ : bibliothèques pugixml, TinyXML-2 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++ : choisir une bibliothèque pour analyser et créer des documents



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 n'existe pas de support XML intégré (à l'exception de l'ancien MSXML), c'est pourquoi les développeurs utilisent des bibliothèques tierces. Dans cet article, nous examinerons trois bibliothèques légères les plus populaires : pugixml, TinyXML-2 et RapidXML. Toutes fonctionnent sans dépendances externes, prennent en charge UTF-8 et conviennent aux systèmes embarqués.



1. pugixml — un choix universel



pugixml est la bibliothèque la plus rapide et la plus fonctionnelle parmi les solutions « légères ». Elle prend en charge XPath, le traitement par flux et une API pratique dans le style STL.



Installation : il suffit de copier pugixml.hpp et pugixml.cpp dans le projet.



Exemple : analyse et lecture 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 << "Erreur : " << result.description() << std::endl; return 1; }

// Obtention de l'élément racine pugi::xml_node root = doc.child("configuration");

// Parcours de tous les éléments <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;}


Création d'un document 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("Exemple");item.append_child("price").text().set(99.99);

doc.save_file("output.xml");


Caractéristiques :

  • Prise en charge de XPath 1.0 pour les requêtes complexes.
  • Gestion des encodages UTF-8/16/32.
  • Mode d'analyse « paresseuse » pour les fichiers volumineux.


2. TinyXML-2 — simplicité et fiabilité



TinyXML-2 est le successeur du classique TinyXML, optimisé en mémoire. Idéal pour les projets simples où XPath n'est pas nécessaire.



Installation : deux fichiers : tinyxml2.h et tinyxml2.cpp.



Exemple : lecture des attributs

#include "tinyxml2.h"#include <iostream>

int main() { tinyxml2::XMLDocument doc; tinyxml2::XMLError err = doc.LoadFile("data.xml");

if (err != tinyxml2::XML_SUCCESS) { std::cerr << "Erreur de chargement : " << 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 << "Livre : " << title << ", pages : " << pages << std::endl; }

return 0;}


Création 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("Ordinateur portable");root->InsertEndChild(product);

doc.SaveFile("catalog.xml");


Avantages :

  • Consommation mémoire minimale (sans copie de chaînes).
  • API simple et intuitive.
  • Prise en charge des commentaires XML et CDATA.


3.

Recommendations