Rev 380 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
#ifndef XMLPARSER_H
#define XMLPARSER_H
#include <iostream>
#include <string>
#include <list>
#include <map>
namespace Util
{
struct XmlHead
{
XmlHead() : is_xml(false) { }
bool is_xml;
std::map<std::string, std::string> atts;
};
struct XmlBody;
class XmlDoc;
struct XmlElement
{
XmlElement(XmlDoc* in_doc, XmlElement* parent_elem) : body(0), doc(in_doc), parent(parent_elem) { }
XmlElement(XmlDoc* in_doc) : body(0), doc(in_doc), parent(0) { }
~XmlElement();
void process_element(XmlElement& elem);
void process_elements();
std::string name;
std::map<std::string, std::string> atts;
XmlBody* body;
XmlDoc* doc;
XmlElement* parent;
};
struct XmlBody
{
XmlBody(XmlDoc* parent) : doc(parent) { }
std::list<std::string> text;
std::list<XmlElement> elements;
XmlDoc* doc;
};
typedef void (*XmlElementHandler)(XmlElement&);
class XmlDoc
{
public:
XmlDoc(const char* filename);
bool is_valid() const { return head.is_xml; }
void add_handler(const std::string& element_name, const XmlElementHandler& h) { handlers[element_name] = h; }
void process_elements();
std::ostream& put(std::ostream& out) const;
private:
friend XmlElement;
void load_xml(const char* filename);
XmlHead head;
XmlBody body;
std::map<std::string, XmlElementHandler> handlers;
};
std::ostream& operator<<(std::ostream& out, const XmlHead& head);
std::ostream& operator<<(std::ostream& out, const XmlElement& elem);
std::ostream& operator<<(std::ostream& out, const XmlBody& body);
inline std::ostream& operator<<(std::ostream& out, const XmlDoc& doc) { return doc.put(out); }
}
#endif // XMLPARSER_H
Generated by GNU Enscript 1.6.6.