Trabajo con YAML en C++: bibliotecas yaml-cpp y rapidyaml

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con YAML en C++: bibliotecas yaml-cpp y rapidyaml



YAML (YAML Ain't Markup Language) es un formato de serialización de datos que se utiliza ampliamente para archivos de configuración, archivos de descripción de entornos (Docker Compose, Kubernetes), así como para el intercambio de datos entre servicios. A diferencia de JSON, YAML es más legible para los humanos gracias a la indentación y al soporte de comentarios.



C++ no tiene soporte integrado para YAML, pero existen excelentes bibliotecas de terceros. En este artículo, veremos las dos más populares: yaml-cpp (clásica, simple) y rapidyaml (moderna, muy rápida). Aprenderá cómo instalar las bibliotecas, leer un archivo YAML, crearlo mediante programación y manejar errores típicos.



1. Biblioteca yaml-cpp



yaml-cpp es la biblioteca estándar de facto para trabajar con YAML en C++. Proporciona una API conveniente que recuerda al trabajo con contenedores STL. La biblioteca admite la especificación YAML 1.2.



Instalación



La forma más sencilla es usar el gestor de paquetes vcpkg o Conan. Para Linux/macOS:



# Instalación mediante vcpkgvcpkg install yaml-cpp

# Instalación mediante Conanconan install yaml-cpp/0.7.0@


Si prefiere compilar manualmente, descargue el código fuente desde GitHub y ejecute:



mkdir build && cd buildcmake ..cmake --build .sudo cmake --install .


Análisis de un archivo YAML



Supongamos que tenemos un archivo de configuración config.yaml:



server:  host: "localhost"  port: 8080  debug: true

database: driver: "postgresql" connection_string: "host=localhost dbname=test" pool_size: 10


Ejemplo de lectura y acceso a datos en C++:



#include <yaml-cpp/yaml.h>#include <iostream>#include <string>

int main() { try { // Carga del archivo YAML::Node config = YAML::LoadFile("config.yaml");

// Acceso a nodos anidados std::string host = config["server"]["host"].as<std::string>(); int port = config["server"]["port"].as<int>(); bool debug = config["server"]["debug"].as<bool>();

std::cout << "Server: " << host << ":" << port << " (debug=" << (debug ? "on" : "off") << ")";

// Verificación de existencia de clave if (config["database"]["pool_size"]) { int pool = config["database"]["pool_size"].as<int>(); std::cout << "Pool size: " << pool << ""; }

// Iteración sobre una secuencia (lista) // Supongamos que en YAML hay un campo: hosts: ["alpha", "beta", "gamma"] // for (const auto& h : config["hosts"]) { // std::cout << "Host: " << h.as<std::string>() << ""; // }

} catch (const YAML::Exception& e) { std::cerr << "YAML parsing error: " << e.what() << ""; return 1; } catch (const std::exception& e) { std::cerr << "General error: " << e.what() << ""; return 1; } return 0;}


Creación de un documento YAML



Con yaml-cpp no solo se puede leer, sino también generar YAML:



#include <yaml-cpp/yaml.h>#include <fstream>

int main() { YAML::Emitter out; out << YAML::BeginMap; out << YAML::Key << "application"; out << YAML::Value << "MyApp"; out << YAML::Key << "version"; out << YAML::Value << 2.5; out << YAML::Key << "features"; out << YAML::Value << YAML::BeginSeq; out << "logging" << "auth" << "cache"; ou

Recommendations