#ifndef XML_PARSER_H
#define XML_PARSER_H
#include <cstdlib>
#include "Namespace.h"
BEGIN_NAMESPACE
enum XmlTokenType
{
XT_Text, // in "abc<blah>xyz</blah>def" it will match 'abc', 'xyz' and 'def'
XT_TagOpen, // emitted after parsing: '<TAG '
XT_TagStart, // emitted after parsing: a TagOpen and then the next '>' (including when '/>')
XT_TagEnd, // emitted after parsing: either '/>' or '</TAG>' (for '/>', TagStart is emitted first)
//XT_Attribute, // it could match in <blah attrib1 attrib2> both 'attrib1' and 'attrib2', but this isn't valid XML
XT_AttributeName, // in <blah attrib="val"> it will match "attrib"
XT_AttributeValue, // in <blah attrib="val"> it will match "\"val\""
XT_Unknown
};
// A sub-string reference without needing to make a copy of the original data
// The life span of m_data may not be persitent, so if needing it later, take a copy
struct XmlStringSlice
{
const char* m_data;
size_t m_length;
};
// An interface for something which can consume XML tokens
class XmlConsumer
{
public:
XmlConsumer() {}
virtual ~XmlConsumer() {}
virtual void consumeToken(XmlTokenType a_type, const XmlStringSlice& a_text) = 0;
};
class XmlParser
{
public:
XmlParser();
~XmlParser();
void parseXmlFile(const char* a_fileName, XmlConsumer& a_consumer);
void parseXmlData(const char* a_data, size_t a_size, XmlConsumer& a_consumer);
};
class XmlDomTreeBuilder : public XmlConsumer
{
public:
XmlDomTreeBuilder();
~XmlDomTreeBuilder();
void printDomTree();
protected:
void consumeToken(XmlTokenType a_type, const XmlStringSlice& a_text);
private:
class XmlDomTreeBuilderData* m_data;
};
END_NAMESPACE
#endif // XML_PARSER_H