|
#include "StdAfx.h"
#include ".\xmlparser.h"
//////////////////////////////////////////////////////////////////////////
// Static Init
//////////////////////////////////////////////////////////////////////////
CXMLParser* CXMLParser::m_pXMLParser = NULL;
//////////////////////////////////////////////////////////////////////
// XML Parsing Handler
//////////////////////////////////////////////////////////////////////
static void XMLCALL xml_start(void *data, const char *el, const char **attr)
{
CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
if ( pXMLParser ) {
pXMLParser->XML_StartElement(data,el,attr);
}
}
static void XMLCALL xml_end(void *data, const char *el)
{
CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
if ( pXMLParser ) {
pXMLParser->XML_EndElement(data,el);
}
}
static void XMLCALL xml_char(void *userData,const XML_Char *s,int len)
{
CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
if ( pXMLParser ) {
pXMLParser->XML_GetCharData(userData,s,len);
}
}
static void XMLCALL xml_cd_start(void *userData)
{
CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
if ( pXMLParser ) {
pXMLParser->XML_StartCDData(userData);
}
}
static void XMLCALL xml_cd_end(void *userData)
{
CXMLParser* pXMLParser = CXMLParser::m_pXMLParser;
if ( pXMLParser ) {
pXMLParser->XML_EndCDData(userData);
}
}
//////////////////////////////////////////////////////////////////////////
// XMLParser Process
//////////////////////////////////////////////////////////////////////////
VOID CXMLParser::XML_StartElement(void *data, const char *el, const char **attr)
{
CUnit* pUnit = new CUnit();
if ( !pUnit ) return;
if ( !m_RootUnit ) {
m_RootUnit = pUnit;
}
if ( m_CurrentUnit ) {
m_CurrentUnit->child_unit.push_back( pUnit );
pUnit->parent_unit = m_CurrentUnit;
}
if ( pUnit ) {
pUnit->element = el;
for (int i = 0;attr[i]; i+= 2)
{
string temp = attr[i];
char* str_id = _strdup( temp.c_str() );
string attr_id = _strlwr( str_id );
string attr_value = attr[i + 1];
if ( str_id ) {
delete [] str_id;
str_id = NULL;
}
pUnit->attributes[attr_id] = attr_value;
}
m_CurrentUnit = pUnit;
}
}
VOID CXMLParser::XML_EndElement(void *data, const char *el)
{
if ( m_CurrentUnit ) {
CUnit* pUnit = m_CurrentUnit->parent_unit;
if ( pUnit ) {
m_CurrentUnit = pUnit;
}
}
}
VOID CXMLParser::XML_StartCDData(void *userData)
{
}
VOID CXMLParser::XML_EndCDData(void *userData)
{
}
VOID CXMLParser::XML_GetCharData(void *userData,const char *s,int len)
{
if ( m_CurrentUnit ) {
m_CurrentUnit->chardata.assign( s , len );
}
}
//////////////////////////////////////////////////////////////////////////
// XMLParser Object Handler
//////////////////////////////////////////////////////////////////////////
CXMLParser::CXMLParser(void)
{
m_RootUnit = NULL;
m_CurrentUnit = NULL;
m_pXMLParser = NULL;
}
CXMLParser::~CXMLParser(void)
{
if ( m_RootUnit ) {
delete m_RootUnit;
m_RootUnit = NULL;
}
}
BOOL CXMLParser::Initialize(LPCTSTR lpszFileName)
{
if ( m_parser ) return FALSE;
if ( !m_File.Open( lpszFileName , CFile::modeRead ) ) return FALSE;
m_parser = XML_ParserCreate(NULL);
m_pXMLParser = this;
// setting handler
XML_SetElementHandler(m_parser, xml_start, xml_end);
XML_SetCharacterDataHandler(m_parser,xml_char);
XML_SetCdataSectionHandler(m_parser,xml_cd_start,xml_cd_end);
return TRUE;
}
VOID CXMLParser::Finalize()
{
if ( m_File.hFileNull != m_File.m_hFile) {
m_File.Close();
}
if ( m_parser ) {
XML_ParserFree(m_parser);
m_parser = NULL;
}
}
BOOL CXMLParser::DoParsing()
{
if ( m_File.m_hFile == m_File.hFileNull ) {
return FALSE;
}
BOOL bDone = FALSE;
UINT nReadByte = 0;
while ( nReadByte = m_File.Read(m_caBuff,nBufferSize) )
{
if ( XML_Parse(m_parser,m_caBuff,nReadByte,bDone) == XML_STATUS_ERROR ) {
CString strErr;
strErr.Format( "Parse error at line:%d %s\n",
XML_GetCurrentLineNumber(m_parser) ,
XML_ErrorString(XML_GetErrorCode(m_parser)));
MessageBox(NULL,strErr,NULL,NULL);
}
if ( bDone ) break;
}
return TRUE;
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.