UTF-8编码的XML数据另类装入
Author:zfive5(zidong)
Email:zfive5@yahoo.com.cn
这些日子忙的不可开交,一周加三天的班,周末也在编写东西,但发现人在忙的时候才可以学到东西,这篇文章的内容就是分析xml数据时得到的,大家都知道用msxml装入xml数据有两种方法,一种就是load文件,当然了这种很简单,但需要一个文件做介质,但如果xml数据是网络传过来的话,先生成文件再load一下分析,最后再删除,总觉得有些别扭,那么只有第二种loadXML了,但这个需要一个BSTR类型的参数,传什么呢?服务器传过来的是utf-8格式的数据呀!
经过实验,终于找到了以下的方法,源码说明一切
Xml编码的文件:
<<?xml version="1.0" encoding="utf-8" ?><
main>zzz</main>
二进制数据如图:
VC分析程序:
FILE *pfile1=NULL;
pfile1=fopen("C://1.xml","rb");
if(pfile1==NULL)
{
return;
}
char szbuftemp[8*1024+32];
memset(szbuftemp,0,sizeof(szbuftemp));
fread(szbuftemp,1,sizeof(szbuftemp),pfile1);
fclose(pfile1);
//UTF-8文件需要跳过前三个标志符 ,UNICODE 需要如下的
//WCHAR *p=(WCHAR *)&szbuftemp[2];当前2是为了跳过unicode的标志符
char *p=(char *)&szbuftemp[3];
char szbuf[100];
::CoInitialize(NULL);
{
MSXML2::IXMLDOMDocumentPtr docPtr;
MSXML2::IXMLDOMNodeListPtr oNodeList;
MSXML2::IXMLDOMNodePtr oNode;
long icount=0;
try
{
docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument));
docPtr->loadXML(_bstr_t(p));
oNodeList=docPtr->selectNodes(L"/main");
icount=oNodeList->length;
AfxMessageBox(itoa(icount,szbuf,10));
oNodeList=NULL;
docPtr=NULL;
}
catch(...)
{
}
}
::CoUninitialize();
return;