BOOL XMLDomParser::OnStartElement(const XML_Char *name, const XML_Char **atts) { XMLElementNode* pParent = m_stack.top(); XMLElementNode* pElemNode = new XMLElementNode(); pElemNode->SetTagName(name); int i = 0; while(atts[i]) { const char* n = atts[i]; const char* val = atts[i+1]; pElemNode->AddAttribute(n, val); i += 2; } pParent->AddChild(pElemNode); m_stack.push(pElemNode); return TRUE; }
BOOL XMLDomParser::Parse(StreamInterface& s, XMLElementNode& root) { this->Reset(); size_t pos = s.tell(); DWORD flag = 0; int_r n2 = s.ReadData(&flag, 3); if(n2 == 3 && flag == utf8_signature) { const char* encoding = "UTF-8"; if(stricmp(encoding, m_encoding.c_str()) && m_parser) { XML_ParserFree(m_parser); m_parser = NULL; } m_encoding = encoding; } else { s.Seek(pos); } if(!m_parser) { if(m_encoding.empty()) m_encoding = "GB2312"; m_parser = XML_ParserCreate(m_encoding.c_str()); if(!m_parser) return FALSE; XML_SetUserData(m_parser, this); XML_SetElementHandler(m_parser, &StartElementHandler, &EndElementHandler); XML_SetCharacterDataHandler(m_parser, &CharacterDataHandler); } if(root.m_tagName.empty()) root.SetTagName("XMLRoot"); m_pRootNode = &root; m_stack.push(m_pRootNode); //const char* orglocale = NULL; //if(m_encoding.icompare("GB2312") == 0) // orglocale = setLocaleToGbk(); //else if(g_encoding == encode_ansii && m_encoding.icompare("UTF-8") == 0) // orglocale = setLocaleToGbk(); int_r n; char cBuffer[2048]; while(n = s.ReadData(&cBuffer, 2048), n>=0) { BOOL isFinal = (n < 2048); XML_Status status = XML_Parse(m_parser, cBuffer, (int)n, isFinal); if(status == XML_STATUS_ERROR) { //if(orglocale) setlocale(LC_CTYPE, orglocale); sprintf_k(cBuffer, sizeof(cBuffer), "%s at line:%d col:%d", XML_ErrorString(XML_GetErrorCode(m_parser)), XML_GetCurrentLineNumber(m_parser), XML_GetCurrentColumnNumber(m_parser)); m_errMsg = cBuffer; return FALSE; } if(isFinal) break; } //if(orglocale) setlocale(LC_CTYPE, orglocale); return TRUE; }