Как скормить Boost.PropertyTree строкой, а не файлом? - PullRequest
16 голосов
/ 13 марта 2011

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

Ответы [ 3 ]

12 голосов
/ 16 декабря 2011

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

// 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");
}
10 голосов
/ 13 марта 2011

Обернуть строку в istringstream.

5 голосов
/ 09 июня 2016

Другие ответы не идеальны, поскольку при использовании 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 сделал (что может быть серьезной проблемой, если ваш входной буфер большой), и избавляет вас от необходимости писать собственный класс потока.

...