Newer
Older
invertedlogic / InvertedLogic / iLFramework / toolkit / include / XmlParser.h
@John Ryland John Ryland on 10 Nov 2019 1 KB rename
#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