今天在完成交互模块时,解析客户端发来的xml时,总是返回NULL
原来应用libxml2的时候一直用xmlParseMemory来加载树,所以今天当有中文字符串时我仍就选择了xmlParseMemory,这就是误解,误认为xmlParseMemory会说I can
结果,一个惨字了得, 半个下午都在搞为什么解析不了
确认是中文编码问题时,我想到的是iconv转码
不管是utf-8到gb2312,更或者是gb2312-utf-8都不行
一顿撞壁后,我决定看api文档
首先我看了xmlParseMemory,确实是可以解析xml格式字符串,不过就是不行
之后我看到了xmlReadFile,xmlReadFd, xmlRead...都有一个encoding settings
此时我晃然大悟, 一定会有一个方法可以按照指定的encoding来解析xml格式字符串
终于我看到了,xmlReadMemory
Function: xmlReadMemory
xmlDocPtr xmlReadMemory (const char * buffer,
int size,
const char * URL,
const char * encoding,
int options)
parse an XML in-memory document and build a tree.
buffer: a pointer to a char array
size: the size of the array
URL: the base URL to use for the document
encoding: the document encoding, or NULL
options: a combination of xmlParserOption
Returns: the resulting document tree
哇哈哈, 应用之
pdoc = xmlReadMemory(m_pRecieveTotalBuffer+m_iHeadPosition,m_lRecieveTotalCount - m_iHeadPosition, NULL, "utf-8", XML_PARSE_RECOVER);
然后遍历, 世界如此美好
xmlNodePtr curNode = root->xmlChildrenNode;
//xmlChar *xcharName;
xmlChar *xcharCid = NULL;
xmlChar *xcharMName = NULL;
xmlChar *xcharFName = NULL;
//char chXmlBuffer[1024]={0};
//xmlAttrPtr attrPtr;
while( curNode != NULL)
{
//xcharName = xmlNodeGetContent(curNode);
if ( xmlStrcmp(curNode->name, (const xmlChar *)"DownloadAd") )
{
xcharCid = xmlGetProp(curNode, (const xmlChar *)"cid");
xcharMName = xmlGetProp(curNode, (const xmlChar *)"mname");
xcharFName = xmlGetProp(curNode, (const xmlChar *)"fname");
MSG_CONTENT * msg = new MSG_CONTENT;
sprintf(msg->chFileName, "%s", (char *)xcharFName);
sprintf(msg->chModeName, "%s", (char *)xcharMName);
msg->hSocket = m_hSocket;
if ( WORKER_THREAD_DOWNLOAD_MODE )
{
EnterCriticalSection(&g_pMainFrame->m_csThreadDownload);
g_pMainFrame->m_arrayDownloadInfo.Add((CObject*)msg);
LeaveCriticalSection(&g_pMainFrame->m_csThreadDownload);
}
else
{
AfxBeginThread(ThreadDownloadModeContentFile, msg);
}
xmlFree(xcharCid);
xmlFree(xcharMName);
xmlFree(xcharFName);
}
else
{
//当前http头协议与xml内容不符合
}
curNode = curNode->next;
}