怎样将目录名,文件名,文件的属性等资料写到XML文件里???? 有没有什么简单的方法?或直接操作XML文件的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用DOM呀!虽然对小XML不是很简单,但是对大的XML就非常方便了。 you can extend the following code snippet#include "stdafx.h"#include <sstream>#include <string>#import "msxml4.dll" named_guidsusing namespace MSXML2;inline void linefeed(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode){ pRootNode->appendChild(pXMLDoc->createTextNode("\n"));}inline void addTextElement(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,LPCTSTR value){ pRootNode->appendChild(pXMLDoc->createTextNode(value));}inline void addTabs(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount){ std::ostringstream oss; for(int i=0;i<tabcount;i++) oss<<"\t"; addTextElement(pXMLDoc,pRootNode,oss.str().c_str());}void addfile(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount){ MSXML2::IXMLDOMElementPtr pTempNode = NULL; pTempNode = pXMLDoc->createElement(_T("file")); linefeed(pXMLDoc,pTempNode); addTabs(pXMLDoc,pTempNode,tabcount+1); addTextElement(pXMLDoc,pTempNode,filename); linefeed(pXMLDoc,pTempNode); addTabs(pXMLDoc,pTempNode,tabcount); addTabs(pXMLDoc,pRootNode,tabcount); pRootNode->appendChild(pTempNode ); linefeed(pXMLDoc,pRootNode);}void savedir(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount){ if ((GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { MSXML2::IXMLDOMNodePtr pDirNode= NULL; addTabs(pXMLDoc,pRootNode,tabcount); pDirNode = pRootNode->appendChild(pXMLDoc->createElement(_T("directory"))); // Step 6.3b: Creating RecID attribute for the Record element MSXML2::IXMLDOMAttributePtr pRecIdAttr = NULL; pRecIdAttr = pXMLDoc->createAttribute(_T("pathname")); pRecIdAttr->nodeTypedValue = filename; pDirNode->attributes->setNamedItem(pRecIdAttr); linefeed(pXMLDoc,pDirNode); WIN32_FIND_DATA wfd= {0}; char allname[MAX_PATH]; strcpy(allname,filename); if(filename[strlen(filename)-1]!='\\') strcat(allname,"\\*.*"); else strcat(allname,"*.*"); HANDLE hFind = FindFirstFile(allname, &wfd); if (hFind == INVALID_HANDLE_VALUE) return ; do { if(wfd.cFileName[0]=='.') continue; strcpy(allname,filename); strcat(allname,"\\"); strcat(allname,wfd.cFileName); if((GetFileAttributes(allname) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { savedir(allname,pXMLDoc,pDirNode,tabcount+1); } else { addfile(wfd.cFileName,pXMLDoc,pDirNode,tabcount+1); } }while(FindNextFile(hFind, &wfd)); FindClose(hFind); addTabs(pXMLDoc,pDirNode,tabcount); addTabs(pXMLDoc,pRootNode,tabcount); } else { addfile(filename,pXMLDoc,pRootNode,tabcount); } linefeed(pXMLDoc,pRootNode);}void test(){ MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL; MSXML2::IXMLDOMParseError *pParsingErr = NULL; MSXML2::IXMLDOMElement *element = NULL; MSXML2::IXMLDOMNodeList *childs = NULL; pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0"); //Creating the Processing Instruction MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL; pPI = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'"); _variant_t vNullVal; vNullVal.vt = VT_NULL; pXMLDoc->insertBefore(pPI, vNullVal); // Creating the Root Element MSXML2::IXMLDOMNodePtr pRootNode= NULL; _variant_t varNodeType((short)MSXML2::NODE_ELEMENT); pRootNode= pXMLDoc->createNode(varNodeType, _T("directorysave"), _T("")); pXMLDoc->appendChild(pRootNode); linefeed(pXMLDoc,pRootNode); savedir("c:\\demo1",pXMLDoc,pRootNode,1); pXMLDoc->save(_T("c:\\directory.xml"));}int _tmain(int argc, _TCHAR* argv[]){ printf("save directory structure into a well formated(with tab and line feed/carriage return) xml file, by Onega\n"); CoInitialize(NULL); test(); CoUninitialize(); return 0;} http://expert.csdn.net/Expert/topic/2427/2427508.xml?temp=5.569094E-02 sscanf 的问题,请指教。 关于对话框中使用RichEdit控件的问题。 急求高手解决,句柄报错! chart控件找不到啊。我的方法那里错了 BHO在2003上能够注册,但是不能运行 如何判断两个网段是否冲突?谢谢各位大侠 各位大虾! 自定义函数问题(菜鸟级) 对话框有15个组合框,打开比较慢,怎么办? MFC 怎么得到当前进程的句柄HINSTANCE 请问谁懂用csocket做的Email客户端软件,请源码,高分倾送!急!急!!急!!! 在对话框上画直线,如果超过对话框的范围,怎么使对话框自动添加Scroll? 关于如何使用树形控件来显示、修改XML文件
#include "stdafx.h"
#include <sstream>
#include <string>
#import "msxml4.dll" named_guids
using namespace MSXML2;
inline void linefeed(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode)
{
pRootNode->appendChild(pXMLDoc->createTextNode("\n"));
}
inline void addTextElement(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,LPCTSTR value)
{
pRootNode->appendChild(pXMLDoc->createTextNode(value));
}
inline void addTabs(MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
std::ostringstream oss;
for(int i=0;i<tabcount;i++)
oss<<"\t";
addTextElement(pXMLDoc,pRootNode,oss.str().c_str());
}
void addfile(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
MSXML2::IXMLDOMElementPtr pTempNode = NULL;
pTempNode = pXMLDoc->createElement(_T("file"));
linefeed(pXMLDoc,pTempNode);
addTabs(pXMLDoc,pTempNode,tabcount+1);
addTextElement(pXMLDoc,pTempNode,filename);
linefeed(pXMLDoc,pTempNode);
addTabs(pXMLDoc,pTempNode,tabcount);
addTabs(pXMLDoc,pRootNode,tabcount);
pRootNode->appendChild(pTempNode );
linefeed(pXMLDoc,pRootNode);
}
void savedir(LPCTSTR filename,MSXML2::IXMLDOMDocument2Ptr pXMLDoc, MSXML2::IXMLDOMNode *pRootNode,int tabcount)
{
if ((GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
MSXML2::IXMLDOMNodePtr pDirNode= NULL; addTabs(pXMLDoc,pRootNode,tabcount);
pDirNode = pRootNode->appendChild(pXMLDoc->createElement(_T("directory")));
// Step 6.3b: Creating RecID attribute for the Record element
MSXML2::IXMLDOMAttributePtr pRecIdAttr = NULL;
pRecIdAttr = pXMLDoc->createAttribute(_T("pathname"));
pRecIdAttr->nodeTypedValue = filename;
pDirNode->attributes->setNamedItem(pRecIdAttr);
linefeed(pXMLDoc,pDirNode); WIN32_FIND_DATA wfd= {0};
char allname[MAX_PATH];
strcpy(allname,filename);
if(filename[strlen(filename)-1]!='\\')
strcat(allname,"\\*.*");
else
strcat(allname,"*.*");
HANDLE hFind = FindFirstFile(allname, &wfd); if (hFind == INVALID_HANDLE_VALUE)
return ;
do
{
if(wfd.cFileName[0]=='.')
continue;
strcpy(allname,filename);
strcat(allname,"\\");
strcat(allname,wfd.cFileName);
if((GetFileAttributes(allname) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
savedir(allname,pXMLDoc,pDirNode,tabcount+1);
}
else
{
addfile(wfd.cFileName,pXMLDoc,pDirNode,tabcount+1);
}
}while(FindNextFile(hFind, &wfd));
FindClose(hFind);
addTabs(pXMLDoc,pDirNode,tabcount); addTabs(pXMLDoc,pRootNode,tabcount);
}
else
{
addfile(filename,pXMLDoc,pRootNode,tabcount);
}
linefeed(pXMLDoc,pRootNode);}
void test()
{
MSXML2::IXMLDOMDocument2Ptr pXMLDoc = NULL;
MSXML2::IXMLDOMParseError *pParsingErr = NULL;
MSXML2::IXMLDOMElement *element = NULL;
MSXML2::IXMLDOMNodeList *childs = NULL;
pXMLDoc.CreateInstance("Msxml2.DOMDocument.4.0");
//Creating the Processing Instruction
MSXML2::IXMLDOMProcessingInstructionPtr pPI = NULL;
pPI = pXMLDoc->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
_variant_t vNullVal;
vNullVal.vt = VT_NULL;
pXMLDoc->insertBefore(pPI, vNullVal);
// Creating the Root Element
MSXML2::IXMLDOMNodePtr pRootNode= NULL;
_variant_t varNodeType((short)MSXML2::NODE_ELEMENT);
pRootNode= pXMLDoc->createNode(varNodeType,
_T("directorysave"), _T(""));
pXMLDoc->appendChild(pRootNode);
linefeed(pXMLDoc,pRootNode);
savedir("c:\\demo1",pXMLDoc,pRootNode,1);
pXMLDoc->save(_T("c:\\directory.xml"));
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("save directory structure into a well formated(with tab and line feed/carriage return) xml file, by Onega\n");
CoInitialize(NULL);
test();
CoUninitialize();
return 0;
}