c++ - ¿Cómo alimentar Boost.PropertyTree con una cadena, no un archivo?
xml input (3)
Aquí hay un código que funciona para mí ...
// Create an empty property tree object
ptree xmlTree;
// Read the XML config string into the property tree. Catch any exception
try {
stringstream ss; ss << xmlConfigString;
read_xml(ss, xmlTree);
}
catch (xml_parser_error &e) {
LOGERROR ("Failed to read config xml " << e.what());
}
catch (...) {
LOGERROR ("Failed to read config xml with unknown error");
}
Boost tiene un tutorial sobre cómo cargar XML desde un archivo . ¿Cómo puedo alimentarlo con una cadena que creo en el código o que recibo de un usuario (por ejemplo, con cin
)?
Envuelva la cadena en un istringstream
.
Las otras respuestas no son ideales porque el uso de istringstream
copia innecesariamente todo el buffer.
Como sugiere una respuesta a esta pregunta , podría utilizar el istrstream
desuso, pero como esto genera advertencias y puede eliminarse en el futuro, una mejor solución es usar boost :: iostreams :
boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());
boost::property_tree::read_json(stream, tree);
Esto evita copiar innecesariamente el búfer de la misma forma que istrstream
hizo istrstream
(que puede ser un problema considerable, si su búfer de entrada es grande), y le ahorra tener que escribir su propia clase de transmisión.