我一save后,节点的缩进全乱了,而且都挤在一行,有什么办法可以控制?
看了以前有关的帖子,但还是没明白怎么回事。

解决方案 »

  1.   

    appending "\n" or "\t" textnodes var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0"); 
    xmlDoc.async = false; 
    // preserveWhiteSpace is useful when loading 
    // existing documents. 
    xmlDoc.preserveWhiteSpace = true; 
    xmlDoc.appendChild(xmlDoc.createElement("root")); 
    xmlDoc.documentElement.appendChild( 
    xmlDoc.createTextNode("\r\n\t")); 
    xmlDoc.documentElement.appendChild( 
        xmlDoc.createElement("child")); 
    xmlDoc.documentElement.appendChild( 
        xmlDoc.createTextNode("\r\n")); 
    xmlDoc.save("test.xml"); 
    you can also use MXXMLWriter and set its indent property
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/6139a6fe-7d4c-449d-9e36-60b68be1de71.asp
      

  2.   

    下面这个函数可以缩进:
    void   AddWhiteSpaceToNode(IXMLDOMDocument*   pDom,IXMLDOMElementPtr   xmlNode,BSTR   bstrWs)
    {
            IXMLDOMText   *pws=NULL;
            IXMLDOMNode   *pBuf=NULL;        pDom->raw_createTextNode(bstrWs,&pws);
            xmlNode->raw_appendChild(pws,&pBuf);
          
            if   (pws)   pws->Release();
            pws=NULL;
            if   (pBuf)   pBuf->Release();
            pBuf=NULL;
    }例如:我们需要换行和加一个TAB
    可以这样调用:
    BSTR   bstr_wsnt=   L"\n\t";
    AddWhiteSpaceToNode(pDoc,xmlNode,bstr_wsnt);
    pDoc是创建DOMDocument对象,xmlNode是节点,调用完以后,即在该节点下换行并加了一个TAB,
    如果要加两个TAB,可以BSTR   bstr_wsnt=   L"\n\t\t";类推
      

  3.   

    我用了上面的两个方法,十分奇怪的是,前两个结点,加缩进能通过,到了第三个,死活不能加,一加就会出现内存不可以写的exception。不知道什么原因啊。大家有人能回答吗??#define RELEASE_PTR(ptr) \
    if(ptr!=NULL) \
    { \
    ptr->Release(); \
    ptr = NULL; \
    } #import <msxml3.dll>
    using namespace MSXML2;
    void   AddWhiteSpaceToNode(IXMLDOMDocument*   pDom,
       IXMLDOMElementPtr   xmlNode,BSTR   bstrWs);int main(int argc, char* argv[])
    {
    CoInitialize(NULL); //COM initial IXMLDOMDocumentPtr ptrXMLDom;
    HRESULT hr;

    hr = ptrXMLDom.CreateInstance(__uuidof(DOMDocument30));
    if(FAILED(hr))
    {
    printf("Failed to CreateInstance on an XML DOM");
    return -1;
    } ptrXMLDom->preserveWhiteSpace = TRUE; // Create a processing instruction targeted for xml.
    IXMLDOMProcessingInstructionPtr pi;
    pi = ptrXMLDom->createProcessingInstruction("xml", 
    "version='1.0' encoding='iso-8859-1' standalone='no'");
    if(pi==NULL)
    {
    printf("Failed to CreateProcessingInstruction");
    return -1;
    }
    else
    {
    ptrXMLDom->appendChild(pi);
    pi.Release();
    } // create root
    IXMLDOMElementPtr ptrRoot; 
    ptrRoot = ptrXMLDom->createElement("inms_license");

    if(ptrRoot==NULL)
    {
    printf("Failed to CreateProcessingInstruction");
    return -1;
    }
    else
    {
    ptrXMLDom->appendChild(ptrRoot);
    ptrRoot.Release(); // 这里把根节点也释放了
    }

    // create 四个框架节点
    IXMLDOMElementPtr pe;
    BSTR bstr_wsnt = L"\n\r\t";
    BSTR bstr_wsnt2 = L"\n\r\t\t"; // 用户信息元素
    pe = ptrXMLDom->createElement("user_information");
    if(pe==NULL)
    {
    printf("Failed to createElement 用户");
    return -1;
    }
    else
    {
    // 元素的属性
    IXMLDOMAttributePtr pa;
    pa = ptrXMLDom->createAttribute("subscriber");
    if(pa!=NULL)
    {
    pa->value = "aaaa";
    pe->setAttributeNode(pa);
    pa->Release();
    }

    //It returns IXMLDOMElement that represents the single element that represents the root of the XML document tree. 
    //ptrXMLDom->documentElement
    // 加节点user_information
    //ptrXMLDom->documentElement->appendChild(ptrXMLDom->createTextNode("\n\t"));

    AddWhiteSpaceToNode(ptrXMLDom,
       ptrXMLDom->documentElement,bstr_wsnt);
    ptrXMLDom->documentElement->appendChild(pe);
    pe.Release();

    }

    // function_license
    pe = ptrXMLDom->createElement("function_license");
    if(pe ==NULL)
    {
    printf("Failed to createElement 功能");
    return -1;
    }
    else
    {
    AddWhiteSpaceToNode(ptrXMLDom,
       ptrXMLDom->documentElement,bstr_wsnt);
    ptrXMLDom->documentElement->appendChild(pe);
    //ptrXMLDom->documentElement->appendChild(ptrXMLDom->createTextNode("\n\t"));
    pe.Release();
    }
    // access_license
    pe = ptrXMLDom->createElement("hccess_license");
    if(pe ==NULL)
    {
    printf("Failed to createElement 接入");
    return -1;
    }
    else
    {
    AddWhiteSpaceToNode(ptrXMLDom,
       ptrXMLDom->documentElement,bstr_wsnt2);
    //ptrXMLDom->documentElement->appendChild(ptrXMLDom->createTextNode("\n\t"));
    ptrXMLDom->documentElement->appendChild(pe);
    pe.Release();
    } // client_license
    pe = ptrXMLDom->createElement("client_license");
    if(pe ==NULL)
    {
    printf("Failed to createElement 客户端");
    return -1;
    }
    else
    {
    //ptrXMLDom->documentElement->appendChild(ptrXMLDom->createTextNode("\n\t"));
    ptrXMLDom->documentElement->appendChild(pe);
    pe.Release();
    }

    ptrXMLDom->documentElement->appendChild(ptrXMLDom->createTextNode("\n")); //display xml
    printf("Dynamically created DOM:\n%s\n", 
    (LPCSTR)ptrXMLDom->xml);
    // release DOM
    if(ptrXMLDom)
    ptrXMLDom.Release();
    CoUninitialize();
    return 0;
    }
    void   AddWhiteSpaceToNode(IXMLDOMDocument*   pDom,
       IXMLDOMElementPtr   xmlNode,BSTR   bstrWs)
    {
            IXMLDOMText   *pws=NULL;
            IXMLDOMNode   *pBuf=NULL;        pDom->raw_createTextNode(bstrWs,&pws);
            xmlNode->raw_appendChild(pws,&pBuf);
          
            RELEASE_PTR(pws);
    RELEASE_PTR(pBuf);
            
    }