MSXML from C++ - pretty print / indent newly created documents

前端 未结 5 1244
陌清茗
陌清茗 2020-12-31 17:07

I\'m writing out XML files using the MSXML parser, with a wrapper I downloaded from here: http://www.codeproject.com/KB/XML/JW_CXml.aspx. Works great except that when I crea

5条回答
  •  死守一世寂寞
    2020-12-31 17:38

    Try this, I found this years ago on the web.

    #include 
    
    bool FormatDOMDocument (IXMLDOMDocument *pDoc, IStream *pStream)
    {
    
        // Create the writer
    
        CComPtr  pMXWriter;
        if (FAILED (pMXWriter.CoCreateInstance(__uuidof (MXXMLWriter), NULL, CLSCTX_ALL)))
        {
            return false;
        }
        CComPtr  pISAXContentHandler;
        if (FAILED (pMXWriter.QueryInterface(&pISAXContentHandler)))
        {
            return false;
        }
        CComPtr  pISAXErrorHandler;
        if (FAILED (pMXWriter.QueryInterface (&pISAXErrorHandler)))
        {
            return false;
        }
        CComPtr  pISAXDTDHandler;
        if (FAILED (pMXWriter.QueryInterface (&pISAXDTDHandler)))
        {
            return false;
        }
    
        if (FAILED (pMXWriter ->put_omitXMLDeclaration (VARIANT_FALSE)) ||
            FAILED (pMXWriter ->put_standalone (VARIANT_TRUE)) ||
            FAILED (pMXWriter ->put_indent (VARIANT_TRUE)) ||
            FAILED (pMXWriter ->put_encoding (L"UTF-8")))
        {
            return false;
        }
    
        // Create the SAX reader
    
        CComPtr  pSAXReader;
        if (FAILED (pSAXReader.CoCreateInstance (__uuidof (SAXXMLReader), NULL, CLSCTX_ALL)))
        {
            return false;
        }
    
        if (FAILED (pSAXReader ->putContentHandler (pISAXContentHandler)) ||
            FAILED (pSAXReader ->putDTDHandler (pISAXDTDHandler)) ||
            FAILED (pSAXReader ->putErrorHandler (pISAXErrorHandler)) ||
            FAILED (pSAXReader ->putProperty (
            L"http://xml.org/sax/properties/lexical-handler", CComVariant (pMXWriter))) ||
            FAILED (pSAXReader ->putProperty (
            L"http://xml.org/sax/properties/declaration-handler", CComVariant (pMXWriter))))
        {
            return false;
        }
    
        // Perform the write
    
        return 
           SUCCEEDED (pMXWriter ->put_output (CComVariant (pStream))) &&
           SUCCEEDED (pSAXReader ->parse (CComVariant (pDoc)));
    }
    

提交回复
热议问题