Работа с XML в C++: библиотеки PugiXML и RapidXML

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с XML в C++: библиотеки PugiXML и RapidXML

XML (Extensible Markup Language) остаётся одним из ключевых форматов для хранения и передачи структурированных данных. В C++ существует несколько мощных библиотек для работы с XML, среди которых выделяются PugiXML (лёгкая, с поддержкой XPath) и RapidXML (максимально быстрая, работающая «на месте»). В этой статье мы разберём обе библиотеки, их особенности, установку и практические примеры.

1. PugiXML — универсальный инструмент

PugiXML — это легковесная, кроссплатформенная библиотека с поддержкой XPath 1.0 и кодировок UTF-8/UTF-16. Она идеально подходит для большинства задач: от чтения конфигурационных файлов до сложного анализа XML-документов.

Установка

Скачайте заголовочные файлы с официального сайта или используйте менеджер пакетов (vcpkg, Conan). Подключите в проект:

#include "pugixml.hpp"
using namespace pugi;

Пример: загрузка и чтение XML

#include <iostream>
#include "pugixml.hpp"

int main() {
    xml_document doc;
    if (!doc.load_file("config.xml")) {
        std::cerr << "Ошибка загрузки файла\n";
        return -1;
    }

    // Получаем корневой элемент
    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 << "Параметр: " << name << " = " << value << "\n";
    }
    return 0;
}

Пример: создание 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() = ("Товар " + std::to_string(i)).c_str();
    item.append_child("price").text() = 100.0 * i;
}
doc.save_file("catalog.xml");

Преимущества PugiXML:

  • Поддержка XPath для сложных запросов (например, doc.select_nodes("//item[@id>1]")).
  • Работа с кодировками и Unicode.
  • Подробная документация и активное сообщество.

2. RapidXML — скорость и минимализм

RapidXML — это header-only библиотека, которая парсит XML без копирования данных (in-place). Она работает значительно быстрее PugiXML, но не поддерживает XPath и требует осторожности с временем жизни строк.

Установка

Скопируйте rapidxml.hpp и дополнительные файлы (rapidxml_utils.hpp, rapidxml_print.hpp) в проект.

Пример: парсинг строки

#include <iostream>
#include "rapidxml.hpp"

int main() {
    char xml[] = "<root><item id='1'>Значение</item></root>";
    rapidxml::xml_document<> doc;
    doc.parse<0>(xml); // 0 — флаги парсинга

    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() << "\n";
        std::cout << "Содержимое: " << item->value() << "\n";
    }
    return 0;
}

Пример: создание 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);

// Вывод в строку
std::string result;
rapidxml::print(std::back_inserter(result), doc);
std::cout << result;

Важно: RapidXML не копирует строки — все узлы указывают на исходный буфер. Убедитесь, что буфер существует, пока используются узлы.

3. Сравнение библиотек

Рекомендаций