[libxml2]小心libxml2解析含有中文字符串时的误解


今天在完成交互模块时,解析客户端发来的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;
							}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值