我用IXMLDOMDocumentType操作XML文件,创建了一些节点然后save后,所有的东西都写在一行了,一点层次都没有,看起来特费劲,有没有什么办法让每个标记都占一行?
解决方案 »
- CListCtrl int InsertItem(int nItem, LPCTSTR lpszItem, int nImage);
- 一个超简单的问题,大家抢分啊!!!!!
- 用MFC做控件,难道不能输出两个以上的结果给VB?
- 请问在引用dll时,在文件中是否包含lib和dll头文件,两者满足一个就可以了
- 关于按钮换肤中的问题!
- 请问在这种情况下如何获得CxxxDoc* p_Doc啊?
- CEDIT框自动滚动
- installshield问题
- 最小化窗口时,如何让其不显示在下面的工具条中?
- 我从网上下载的thinkinc++中文版pdf格式,为什莫打开看时是乱码?
- 想编写一个浏览器程序。遇到了一些问题。近来看看UP有分
- 怎么样得到增加或者删除磁盘的信息,比如可热插拔的SCSI磁盘?
//下面代码未检验,MSXMLDOM2V4是我改的namespace
HRESULT hr;
MSXMLDOM2V4::IMXWriterPtr pWriter;
hr = pWriter.CreateInstance("msxml2.MXXMLWriter40");
VARIANT var;
var.vt = VT_BYREF|VT_UNKNOWN;
var.punkVal = m_pDoc;
pWriter->output = var;
if(szEncoding != NULL && lstrlen(szEncoding) > 0)
hr = pWriter->put_encoding(CComBSTR(szEncoding)); hr = pWriter->put_indent(VARIANT_TRUE);//缩进
hr = pWriter->put_version(L"1.0");
hr = pWriter->put_output(&CComVariant(szFilePath));
hr = pWriter->flush();
return hr;
//下面代码未检验,MSXMLDOM2V4是我改的namespace
HRESULT hr;
MSXMLDOM2V4::IMXWriterPtr pWriter;
hr = pWriter.CreateInstance("msxml2.MXXMLWriter40");
VARIANT var;
var.vt = VT_BYREF|VT_UNKNOWN;
var.punkVal = m_pDoc;
pWriter->output = var;
if(szEncoding != NULL && lstrlen(szEncoding) > 0)
hr = pWriter->put_encoding(CComBSTR(szEncoding)); hr = pWriter->put_indent(VARIANT_TRUE);//缩进
hr = pWriter->put_version(L"1.0");
hr = pWriter->put_output(&CComVariant(szFilePath));
hr = pWriter->flush();
return hr;
#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;
}