Работа с 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) из
Также в библиотеке
WebSocket библиотеки Java: Полное руководство по реализации реального времени
Pygame – разработка игр
gRPC для C++: библиотеки, примеры и руководство по использованию
AngleSharp для C# (.NET): полное руководство с примерами
Работа с Apache Kafka в Node.js: библиотека KafkaJS
Рекомендаций