如何使用字符串而不是文件提供Boost.PropertyTree?

时间:2011-03-13 11:32:56

标签: c++ xml boost input boost-propertytree

Boost有一个tutorial on how to load XML from a file。如何使用我在代码中创建或从用户接收的字符串(例如使用cin)来提供它?

3 个答案:

答案 0 :(得分:12)

以下是一些适合我的代码......

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

答案 1 :(得分:10)

将字符串换行istringstream

答案 2 :(得分:5)

其他答案不理想,因为使用istringstream会不必要地复制整个缓冲区。

正如this question建议的答案所示,您可以使用已弃用的istrstream,但由于这会生成警告并且将来可能会被删除,因此更好的解决方案是使用boost::iostreams:< / p>

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

这避免了以istrstream所做的相同方式不必要地复制缓冲区(如果你的输入缓冲区很大,这可能是一个相当大的问题),并且你不必编写你自己的流类。