Subversion Repositories gelsvn

Rev

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.