Files
source/Utils/XML_Parser.h
T
Wanne 14750c6903 **********************************************************
** Big Maps Projects code (incl. Multiplayer v1.5 **
**********************************************************
- Merged Big Maps Project code from BMP+MP trunk (Revision: 3340)
o Complete SVN Revision history: https://81.169.133.124/source/ja2/branches/Wanne/JA2%201.13%20MP
- Before THIS merge, I made a branch of the existing 1.13 source
o SVN Branch: https://81.169.133.124/source/ja2/branches/JA2_rev.3336/src
- Removed old VS 6.0 and VS 2003 project and solutions files, because compilation is broken long time ago
- I will add VS 2010 projects and solution file in the next few days

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@3341 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2010-02-28 18:38:52 +00:00

98 lines
2.4 KiB
C++

#ifndef _XML_PARSER_H_
#define _XML_PARSER_H_
#include "expat.h"
#include "XML.h"
class IXMLParser
{
public:
const XML_Char* ElementName;
public:
IXMLParser(const XML_Char *element_name, XML_Parser &parser, IXMLParser* caller=NULL)
: _parser(parser), _caller(caller), ElementName(element_name) {};
~IXMLParser() {};
/**
* Interface
*/
static void onStartCallback(void *userData, const XML_Char* name, const XML_Char** atts)
{
((IXMLParser*)userData)->onStartElement(name,atts);
}
static void onEndCallback(void *userData, const XML_Char* name)
{
((IXMLParser*)userData)->onEndElement(name);
// test if we are done here
if( ((IXMLParser*)userData)->_caller && (strcmp(name, ((IXMLParser*)userData)->ElementName) == 0) )
{
((IXMLParser*)userData)->_caller->grabParser();
}
}
static void onTextCallback(void *userData, const XML_Char *str, int len)
{
((IXMLParser*)userData)->onTextElement(str,len);
}
void grabParser()
{
XML_SetUserData(_parser,this);
XML_SetElementHandler(_parser, IXMLParser::onStartCallback, IXMLParser::onEndCallback);
XML_SetCharacterDataHandler(_parser, IXMLParser::onTextCallback);
}
/**
* Override these methods in your parser
*/
virtual void onStartElement(const XML_Char* name, const XML_Char** atts)
{};
virtual void onEndElement(const XML_Char* name)
{};
virtual void onTextElement(const XML_Char *str, int len)
{};
protected:
XML_Char const* getAttribute(const XML_Char* attr_name, const XML_Char** atts)
{
while(*atts)
{
if(strcmp(*atts++,attr_name) == 0)
{
return *atts;
}
atts++;
}
return "";
}
bool getAttributeAsInt(const XML_Char* attr_name, const XML_Char** attr, int &value)
{
XML_Char const* result = getAttribute(attr_name,attr);
if( strcmp(result,"") != 0)
{
value = (int)atol(result);
return true;
}
return false;
}
bool getAttributeAsFloat(const XML_Char* attr_name, const XML_Char** attr, float &value)
{
XML_Char const* result = getAttribute(attr_name,attr);
if( strcmp(result,"") != 0)
{
value = (float)atof(result);
return true;
}
return false;
}
int getCurrentLineNumber()
{
return XML_GetCurrentLineNumber(this->_parser);
}
protected:
std::string sCharData;
XML_Parser& _parser;
IXMLParser* _caller;
};
#endif // _XML_PARSER_H_