问题
Boost has a tutorial on how to load XML from a file. How do I feed it with a string that I either create in code or receive from a user (e.g. with cin
)?
回答1:
Wrap the string in an istringstream.
回答2:
Heres some code that works for me...
// 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:
The other answers are non-ideal, because using istringstream
needlessly copies the entire buffer.
As an answer on this question suggests, you could use the deprecated istrstream
, but as this generates warnings and may be removed in future, a better solution is to use boost::iostreams:
boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());
boost::property_tree::read_json(stream, tree);
This avoids needlessly copying the buffer in the same way istrstream
did (which can be a considerable problem, if your input buffer is large), and saves you having to write your own stream class.
来源:https://stackoverflow.com/questions/5289086/how-to-feed-boost-propertytree-with-a-string-not-a-file