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.