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


person Rella    schedule 13.03.2011    source источник


Ответы (3)


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

person Fred Foo    schedule 13.03.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");
}
person jugs    schedule 16.12.2011

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

person Riot    schedule 08.06.2016