I have used these functions for XML parsing for several years with very impressive performance. Perhaps they will help you also:
BOOL XMLGetNodeValue(LPCTSTR cpXML, LPCTSTR cpTagName, LPTSTR cpBuf)
{
BOOL bRetval = FALSE;
LPTSTR cpTagStartB = NULL;
LPTSTR cpTagStartE = NULL;
LPTSTR cpTagEndB = NULL;
*cpBuf = 0;
if (XMLFindNode(cpXML,cpTagName,&cpTagStartB,&cpTagStartE,&cpTagEndB))
{
if (cpTagStartE != cpTagEndB && cpTagEndB)
{
int iLen = (cpTagEndB-cpTagStartE)-1;
memcpy(cpBuf,cpTagStartE+1,iLen*sizeof(TCHAR));
*(cpBuf+iLen) = 0;
}
bRetval = TRUE;
}
return bRetval;
}
BOOL XMLFindNode(LPCTSTR cpXML, LPCTSTR cpTagName, TCHAR **cpTagStartB, TCHAR **cpTagStartE, TCHAR **cpTagEndB)
{
BOOL bRetval = FALSE;
TCHAR caTag[512];
_stprintf(caTag,_T("<%s"),cpTagName);
int iLen = _tcslen(caTag);
LPTSTR cpStart = _tcsstr(cpXML,caTag);
if (cpStart)
{
if (*(cpStart+iLen) == ' ' || *(cpStart+iLen) == '>')
{
if (cpTagStartB)
*cpTagStartB = cpStart;
LPTSTR cpEnd = _tcschr(cpStart, '>');
if (cpTagStartE)
*cpTagStartE = cpEnd;
if (cpEnd && *(cpEnd-1) == '/' && cpTagEndB)
*cpTagEndB = cpEnd;
else
{
if (cpEnd && cpTagEndB)
{
_stprintf(caTag,_T("</%s>"),cpTagName);
*cpTagEndB = _tcsstr(cpEnd,caTag);
}
}
bRetval = TRUE;
}
else
return XMLFindNode(cpStart+iLen,cpTagName,cpTagStartB,cpTagStartE,cpTagEndB);
}
return bRetval;
}
BOOL XMLFindNodeAttribute(LPCTSTR cpXML, LPCTSTR cpTagName, LPCTSTR cpAttribName, LPTSTR cpAttribValue, TCHAR **cpTagStart )
{
BOOL bRetval = FALSE;
LPTSTR cpTagStartB = NULL;
LPTSTR cpTagStartE = NULL;
bRetval = XMLFindNode(cpXML,cpTagName, &cpTagStartB,&cpTagStartE);
if (bRetval)
{
TCHAR caBuf[512];
_stprintf(caBuf,_T("%s="),cpAttribName);
LPTSTR p = _tcsstr(cpTagStartB+_tcslen(cpTagName),caBuf);
if (p && p < cpTagStartE)
{
p += _tcslen(caBuf);
if (*p == '\"')
p++;
int iCount = 0;
LPTSTR cpAttribEnd = p;
while (*cpAttribEnd != '\"' && cpAttribEnd < cpTagStartE)
{
*(cpAttribValue+iCount) = *cpAttribEnd;
cpAttribEnd++;
iCount++;
}
*(cpAttribValue+iCount) = 0;
}
if (cpTagStart)
*cpTagStart = cpTagStartB;
}
return bRetval;
}