Как подать Boost.PropertyTree со строкой, а не с файлом?

Boost имеет учебник по загрузке XML из файла. Как передать его строкой, которую я либо создаю в коде, либо получаю от пользователя (например, с помощью cin)?

Ответы

Ответ 2

Вот какой код работает для меня...

// 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");
}

Ответ 3

Другие ответы не идеальны, потому что использование istringstream без необходимости копирует весь буфер.

Как следует из ответа на этот вопрос, вы можете использовать устаревший istrstream, но поскольку это генерирует предупреждения и может быть удалено в будущем, лучшим решением будет использовать boost:: iostreams:

boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());
boost::property_tree::read_json(stream, tree);

Это позволяет избежать ненужного копирования буфера тем же способом istrstream (что может быть значительной проблемой, если ваш входной буфер является большим) и сохраняет необходимость писать собственный класс потока.