Работа с XML в C++: библиотеки, парсинг и создание XML-документов

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

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

Начать курс

Работа с XML в C++: обзор библиотек для парсинга и создания XML-документов

XML (Extensible Markup Language) остаётся популярным форматом для хранения и передачи структурированных данных, особенно в конфигурационных файлах, веб-сервисах (SOAP, XML-RPC) и обмене данными между системами. В C++ нет встроенной поддержки XML (за исключением устаревшего MSXML), поэтому разработчики обращаются к сторонним библиотекам. В этой статье мы рассмотрим три самые популярные и лёгкие библиотеки для работы с XML в C++: TinyXML-2, PugiXML и RapidXML. Вы узнаете, как установить каждую из них, как парсить и создавать XML-документы, а также сравним их производительность и удобство использования.

1. TinyXML-2

TinyXML-2 — это простая, минималистичная библиотека, состоящая всего из двух файлов (tinyxml2.h и tinyxml2.cpp). Она идеальна для небольших проектов, где не требуется высокая производительность, но важна простота интеграции. Библиотека лицензирована под Zlib, что позволяет свободно использовать её в коммерческих проектах.

Установка

Скопируйте файлы tinyxml2.h и tinyxml2.cpp из официального репозитория в ваш проект и подключите их. Никаких дополнительных зависимостей не требуется.

Пример: чтение XML

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

int main() {
    tinyxml2::XMLDocument doc;
    doc.LoadFile("config.xml");

    tinyxml2::XMLElement* root = doc.RootElement();
    if (root) {
        const char* value = root->FirstChildElement("setting")->GetText();
        std::cout << "Setting: " << value << std::endl;
    }
    return 0;
}

Пример: создание XML

#include "tinyxml2.h"

int main() {
    tinyxml2::XMLDocument doc;
    tinyxml2::XMLDeclaration* decl = doc.NewDeclaration();
    doc.InsertFirstChild(decl);

    tinyxml2::XMLElement* root = doc.NewElement("root");
    root->SetAttribute("version", "1.0");
    doc.InsertEndChild(root);

    tinyxml2::XMLElement* child = doc.NewElement("item");
    child->SetText("Hello, XML!");
    root->InsertEndChild(child);

    doc.SaveFile("output.xml");
    return 0;
}

2. PugiXML

PugiXML — это более быстрая и функциональная библиотека, чем TinyXML-2. Она поддерживает XPath, работу с кодировками UTF-8/16 и имеет удобный API. PugiXML часто используется в проектах, где требуется баланс между скоростью и удобством. Распространяется под лицензией MIT.

Установка

Скачайте исходники с GitHub и добавьте pugixml.cpp и pugixml.hpp в проект. Для использования XPath добавьте PUGIXML_HAS_XPATH в определения препроцессора.

Пример: чтение XML с XPath

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

int main() {
    pugi::xml_document doc;
    doc.load_file("data.xml");

    pugi::xpath_node result = doc.select_node("//item[@id='1']");
    if (result) {
        std::cout << "Found: " << result.node().child_value() << std::endl;
    }
    return 0;
}

Пример: создание XML

#include "pugixml.hpp"

int main() {
    pugi::xml_document doc;
    pugi::xml_node root = doc.append_child("configuration");
    root.append_attribute("version") = "2.0";

    pugi::xml_node param = root.append_child("param");
    param.append_attribute("name") = "timeout";
    param.text().set("30");

    doc.save_file("config.xml");
    return 0;
}

3. RapidXML

RapidXML — это самая быстрая библиотека для парсинга XML в C++. Она работает in-place (изменяет исходную строку), что даёт максимальную производительность, но требует осторожности при работе с памятью. Библиотека не выделяет память динамически, а использует стековые буферы. Лицензия — Boost Software License.

Установка

Скачайте заголовочные файлы (rapidxml.hpp, rapidxml_utils.hpp, rapidxml_print.hpp) из

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

JSON обработка в C++: библиотека nlohmann/json для работы с данными

JSON обработка в C++: библиотека nlohmann/json для работы с данными

Мониторинг приложений на Rust: библиотеки и инструменты для отслеживания производительности

Мониторинг приложений на Rust: библиотеки и инструменты для отслеживания производительности

Работа с датами в Swift (iOS/macOS): библиотеки и инструменты

Работа с датами в Swift (iOS/macOS): библиотеки и инструменты

mikro-orm для TypeScript: полное руководство с примерами

mikro-orm для TypeScript: полное руководство с примерами