#ifndef BASE_XML_UTILS_H #define BASE_XML_UTILS_H #include #include #include #include #include #include #include using namespace std; //---------------------------------------------------------------- namespace xml_utils { // Simple wrapper to ensure the parser gets freed if an exception // is thrown during parsing. class xml_parser { public: xml_parser() : parser_(XML_ParserCreate(NULL)) { if (!parser_) throw runtime_error("couldn't create xml parser"); } ~xml_parser() { XML_ParserFree(parser_); } XML_Parser get_parser() { return parser_; } void parse(std::string const &backup_file, bool quiet); private: unique_ptr create_monitor(bool quiet); XML_Parser parser_; }; typedef std::map attributes; void build_attributes(attributes &a, char const **attr); template T get_attr(attributes const &attr, string const &key) { attributes::const_iterator it = attr.find(key); if (it == attr.end()) { ostringstream out; out << "could not find attribute: " << key; throw runtime_error(out.str()); } return boost::lexical_cast(it->second); } template boost::optional get_opt_attr(attributes const &attr, string const &key) { typedef boost::optional rtype; attributes::const_iterator it = attr.find(key); if (it == attr.end()) return rtype(); return rtype(boost::lexical_cast(it->second)); } } //---------------------------------------------------------------- #endif