2011-03-13 6 views

Respuesta

11

Heres un código que funciona para mí ...

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

Las otras respuestas son no ideal, porque el uso de istringstream innecesariamente copias en todo el búfer.

Como una respuesta en this question sugiere, se puede utilizar el istrstream en desuso, pero ya que esto genera avisos y puede ser removido en el futuro, una mejor solución es utilizar boost::iostreams:

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

Esto evita innecesariamente copiar el buffer de la misma manera que lo hizo istrstream (que puede ser un problema considerable, si su búfer de entrada es grande), y le ahorra tener que escribir su propia clase de flujo.

Cuestiones relacionadas