我用IXMLDOMDocumentType操作XML文件,创建了一些节点然后save后,所有的东西都写在一行了,一点层次都没有,看起来特费劲,有没有什么办法让每个标记都占一行?

解决方案 »

  1.   

    IMXWriter::put_indent(VARIANT_TRUE);
    //下面代码未检验,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;
      

  2.   

    IMXWriter::put_indent(VARIANT_TRUE);
    //下面代码未检验,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;
      

  3.   

    #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;
    }