#ifndef LIBDCP_XML_H #define LIBDCP_XML_H #include #include #include #include #include #include "types.h" #include "exceptions.h" namespace xmlpp { class Node; class DomParser; } namespace libdcp { class XMLNode { public: XMLNode (); XMLNode (xmlpp::Node const * node); protected: std::string string_node (std::string); std::string optional_string_node (std::string); ContentKind kind_node (std::string); Fraction fraction_node (std::string); int64_t int64_node (std::string); void ignore_node (std::string); void done (); template boost::shared_ptr sub_node (std::string name) { return boost::shared_ptr (new T (xml_node (name))); } template boost::shared_ptr optional_sub_node (std::string name) { std::list n = xml_nodes (name); if (n.size() > 1) { throw XMLError ("duplicate XML tag"); } else if (n.empty ()) { return boost::shared_ptr (); } return boost::shared_ptr (new T (n.front ())); } template std::list > sub_nodes (std::string name, std::string sub) { XMLNode p (xml_node (name)); std::list n = p.xml_nodes (sub); std::list > r; for (typename std::list::iterator i = n.begin(); i != n.end(); ++i) { r.push_back (boost::shared_ptr (new T (*i))); } return r; } xmlpp::Node const * _node; private: xmlpp::Node* xml_node (std::string); std::list xml_nodes (std::string); std::list _taken; }; class XMLFile : public XMLNode { public: XMLFile (std::string file, std::string root_name); virtual ~XMLFile (); private: xmlpp::DomParser* _parser; }; } #endif