用VC吧,下面有一個(gè)例子,你參照下:
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),青山企業(yè)網(wǎng)站建設(shè),青山品牌網(wǎng)站建設(shè),網(wǎng)站定制,青山網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,青山網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
void?CreateXml()
{
CoInitialize(NULL);
//?創(chuàng)建文檔
MSXML2::IXMLDOMDocument2Ptr?pXMLDoc?=?NULL;
//創(chuàng)建DOMDocument對(duì)象
HRESULT?hr?=?pXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if?(!SUCCEEDED(hr))
{
return;
}
//?Create?the?Processing?Instruction
MSXML2::IXMLDOMProcessingInstructionPtr?pXMLProc?=?NULL;
pXMLProc?=?pXMLDoc-createProcessingInstruction("xml",?"version='1.0'?encoding='UTF-8'");
_variant_t?vNullVal;
vNullVal.vt?=?VT_NULL;
pXMLDoc-insertBefore(pXMLProc,?vNullVal);
//?創(chuàng)建根結(jié)點(diǎn)
_variant_t?varNodeType((short)MSXML2::NODE_ELEMENT);
MSXML2::IXMLDOMNodePtr?pXMLNodeRoot=?NULL;?
pXMLNodeRoot?=?pXMLDoc-createNode(varNodeType,?_T("Cases"),?_T(""));
//?添加根結(jié)點(diǎn)
pXMLDoc-appendChild(pXMLNodeRoot);
//?創(chuàng)建并添加下級(jí)結(jié)點(diǎn)
MSXML2::IXMLDOMNodePtr?pXMLNodeNode=?NULL;?
pXMLNodeNode?=?pXMLNodeRoot-appendChild(pXMLDoc-createElement(_T("Case")));
//?創(chuàng)建下級(jí)元素結(jié)點(diǎn)
MSXML2::IXMLDOMElementPtr?pXMLEle?=?NULL;
pXMLEle?=?pXMLDoc-createElement(_T("CopyFile"));
//?創(chuàng)建并設(shè)置下級(jí)結(jié)點(diǎn)屬性
MSXML2::IXMLDOMAttributePtr?pXMLAttr?=?NULL;
pXMLAttr?=?pXMLDoc-createAttribute(_T("src"));
pXMLAttr-nodeTypedValue?=?"C:\\test.txt";
pXMLEle-attributes-setNamedItem(pXMLAttr);
pXMLAttr?=?pXMLDoc-createAttribute(_T("dest"));
pXMLAttr-nodeTypedValue?=?"D:\\Test.txt";
pXMLEle-attributes-setNamedItem(pXMLAttr);
//?添加元素結(jié)點(diǎn)
pXMLNodeNode-appendChild(?pXMLEle);
MSXML2::IXMLDOMElementPtr?pXMLEle1?=?NULL;
pXMLEle1?=?pXMLDoc-createElement(_T("DelFile"));
pXMLEle1-appendChild(pXMLDoc-createTextNode("C:\\test.txt"));
//?添加元素結(jié)點(diǎn)
pXMLNodeNode-appendChild(?pXMLEle1);
//?保存文檔
pXMLDoc-save(_T("d:\\Test.xml"));
}
效果如下:
?xml?version="1.0"?encoding="UTF-8"???
Cases
Case
CopyFile?src="C:\test.txt"?dest="D:\Test.txt"?/?
DelFileC:\test.txt/DelFile?
/Case
/Cases
為了能夠讓MFC認(rèn)識(shí)MSXML2,我們需要引入相應(yīng)的dll,代碼如下;
#import "msxml4.dll"
/*?前段時(shí)間恰好做過(guò)類似的東西,代碼可以給你參考下。
*??Xml配置見(jiàn)最后
*/
typedef?struct?SrcFileFmt
{
int???ColID;
char??ColCode[64];??????/*?字段英文名稱?*/
char??ColName[128];?????/*?字段中文名稱*/
char??ColType[20];??????/*?字段類型(包含長(zhǎng)度)?*/
char??ColComment[128];??/*?字段描述?*/
}SrcFileFmt;
int?main(int?argc,?char?**argv)
{
SrcFileFmt?SrcFileFmt[128];
int?iNum?=?-1;
if?(?2??argc?)
{
printf("Usage:?%s?SrcXmlFile\n",?argv[0]);
return?-1;
}
iNum?=?parseSourceCfg(SrcCfgFile,?SrcFileFmt);
if?(iNum?==?-1)
{
return?-1;
}
return?0;
}
/*?調(diào)用此函數(shù)后,xml文件的內(nèi)容會(huì)被存儲(chǔ)到結(jié)構(gòu)體數(shù)組SrcFileFmt?srcfilefmt[]中
*?此函數(shù)依賴于libxml2-2.9.2.tar.xz
*/
int?parseSourceCfg(char?*FileName,?SrcFileFmt?srcfilefmt[])
{?/*?解析源文件xml,FileName?為源xml文件名?*/
xmlDocPtr?doc;
xmlNodePtr?cur,?root;
char?sFileName[64]?=?{'\0'};
int?cnt?=?0;
if?(FileName?==?NULL)
{
return?-1;
}
sprintf(sFileName,?"%s.xml",?FileName);
doc?=?xmlParseFile(sFileName);
if?(doc?==?NULL)
{
return?-1;
}
root?=?xmlDocGetRootElement(doc);
if?(root?==?NULL)?{
xmlFreeDoc(doc);
return(-1);
}
if?(xmlStrcmp(root-name,?(const?xmlChar?*)?"SrcRoot"))
{
xmlFreeDoc(doc);
return?-1;
}
cur?=?root-xmlChildrenNode;
while?(cur?!=?NULL)?
{
if?((!xmlStrcmp(cur-name,?(const?xmlChar?*)"Column")))
{
xmlChar?*key;
xmlNodePtr?cur_sub?=?cur;
cur_sub?=?cur_sub-xmlChildrenNode;
while?(cur_sub?!=?NULL)?
{
if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColID")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
srcfilefmt[cnt].ColID?=?atoi((char*)key);
xmlFree(key);
}
if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColCode")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColCode,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColName")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColName,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColType")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColType,?(char*)key);
xmlFree(key);
}
else?if?((!xmlStrcmp(cur_sub-name,?(const?xmlChar?*)"ColComment")))?{
key?=?xmlNodeListGetString(doc,?cur_sub-xmlChildrenNode,?1);
killblank((char*)key);
strcpy(srcfilefmt[cnt].ColComment,?(char*)key);
xmlFree(key);
}
cur_sub?=?cur_sub-next;
}
cnt++;
}
cur?=?cur-next;
}
xmlFreeDoc(doc);?
return?cnt;
}
SrcRoot
Column
ColID1/ColID
ColCodekmh/ColCode
ColName字段1/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID2/ColID
ColCodedfkmh/ColCode
ColName字段2/ColName
ColTypeVARCHAR(11)/ColType
/Column
Column
ColID3/ColID
ColCodehbh/ColCode
ColName字段3/ColName
ColTypeINTEGER(10)/ColType
/Column
/SrcRoot
/***************
?xml?version="1.0"?encoding="utf-8"?
Cases
case
No001/No
CopyFile?src="C:\test.txt"?dest="D:\test.txt"/CopyFile
/case
case
No002/No
DelFileC:\test.txt/DelFile
/case
/Cases
*******************/
//?我們用MFC來(lái)讀取上述xml,代碼如下:
void?ReadXml(CString?strXmlPath)
{
MSXML2::IXMLDOMDocumentPtr?pDoc;
::CoInitialize(NULL);
HRESULT?hr?=?pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));?
if?(!SUCCEEDED(hr))?
{??
MessageBox(_T("創(chuàng)建DOMDocument對(duì)象失敗。\n請(qǐng)檢查運(yùn)行環(huán)境"),?_T("錯(cuò)誤"),?MB_ICONERROR);?
return;
}
//?讀取xml
pDoc-put_async(VARIANT_FALSE);
VARIANT_BOOL?bhr?=?pDoc-load((_variant_t)strXmlPath);
if?(bhr?!=?VARIANT_TRUE)?{
MessageBox(_T("無(wú)法正確讀取xml文件"),?_T("錯(cuò)誤"),?MB_ICONERROR);
return;
}
//?根節(jié)點(diǎn)取得
MSXML2::IXMLDOMElementPtr?root?=?pDoc-documentElement;
//?取得根節(jié)點(diǎn)的名字
_variant_t?strRootName?=?root-nodeName;
_bstr_t?wstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtr?nodeList?=?root-GetchildNodes();//cases
//?解析cases的子節(jié)點(diǎn)
ReadCases(nodeList);
}
void?ReadCases(MSXML2::IXMLDOMNodeListPtr?nodeList)
{
int?ilength?=?nodeList-Getlength();
for?(int?nodeCount?=?0;?nodeCount??ilength;?nodeCount++)?{
MSXML2::IXMLDOMNodePtr?nodePtr?=?nodeList-nextNode();
_variant_t?strNodeName?=?nodePtr-GetnodeName();
_variant_t?strNodeValue?=?nodePtr-GetnodeValue();
//?讀取case節(jié)點(diǎn)下的子節(jié)點(diǎn)
ReadCase(nodePtr-GetchildNodes());
}
}
void?ReadCase(MSXML2::IXMLDOMNodeListPtr?nodeList)
{
CString?strLogInfo;
strLogInfo.Empty();
CString?strNo;??????????????//?case編號(hào)
CString?strSrcFile;?????????//?源文件
CString?strDestFile;????????//?目標(biāo)文件
for?(int?nodeCount?=?0;?nodeCount??nodeList-Getlength();?nodeCount++)
{
MSXML2::IXMLDOMNodePtr?nodePtr?=?nodeList-nextNode();
_variant_t?strCaseNodeName?=?nodePtr-GetnodeName();
_variant_t?strCaseNodeValue?=?nodePtr-Gettext();
BSTR?bStrTemp?=?strCaseNodeName.bstrVal;
CString?strTemp?=?CString(bStrTemp);
SysFreeString(bStrTemp);
CString?strNodeName?=?strTemp;
//??節(jié)點(diǎn)的值,如何取得?
if?(0?==?strNodeName.CompareNoCase(_T("NO")))
{
strNo?=?(BSTR)strCaseNodeValue.pbstrVal;
//?取得的值可以打印出來(lái)
printf(strNo);
}
//?節(jié)點(diǎn)有屬性值,該怎么處理?
else?if?(0?==?strNodeName.CompareNoCase(_T("CopyFile")))
{
strSrcFile.Empty();
strDestFile.Empty();
//?取得節(jié)點(diǎn)的屬性值
MSXML2::IXMLDOMNamedNodeMapPtr?pDOMAttrList=?nodePtr-Getattributes();
for?(int?j?=?0;?j??pDOMAttrList-Getlength();?j++)
{
MSXML2::IXMLDOMNodePtr?pDOMAttr=?pDOMAttrList-Getitem(j);?
//?取得源文件路徑
if?(CompareNoCase((char*)pDOMAttr-GetnodeName(),?_T("src")))
{
strSrcFile?=?pDOMAttr-GetnodeTypedValue();
//?取得目標(biāo)文件路徑
}?else?if?(CompareNoCase((char*)pDOMAttr-GetnodeName(),?_T("dest")))
{
strDestFile?=pDOMAttr-GetnodeTypedValue();
}
CopyFile(strSrcFile,?strDestFile,?FALSE);
}
else?if?(0?==?strNodeName.CompareNoCase(_T("DelFile")))
{
strDestFile.Empty();
strDestFile?=?CString((BSTR)strCaseNodeValue.pbstrVal);
DeleteFile(strDestFile);
}?
}
}
//?為了能夠讓MFC認(rèn)識(shí)MSXML2,我們需要引入相應(yīng)的dll,代碼如下;
#import?"msxml4.dll"
把所有的數(shù)據(jù)當(dāng)做一個(gè)字符串
收到數(shù)據(jù)后先strstr(buffer,"?xml version=\"1.0\" encoding=\"UTF-8\"?");
如果返回的是NULL則表示沒(méi)有這段 退出
buffer是你收到的數(shù)據(jù)起始地址
名稱欄目:c語(yǔ)言xml處理函數(shù),c語(yǔ)言解析xml
網(wǎng)站地址:http://sd-ha.com/article36/dssgdpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、定制網(wǎng)站、服務(wù)器托管、品牌網(wǎng)站制作、虛擬主機(jī)、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)