2009-04-08 126 views
1

通过C++使用MSXML,当我打电话IXMLDOMDocument::save,空XML元素会得到一个结束标记,像这样:保存没有结束标签的IXMLDOMDocument

<root> 
    <child name="first"> 
    </child> 
</root> 

但我想它保存为这样:

<root> 
    <child name="first" /> 
</root> 

我需要做些什么才能做到这一点?

回答

1

DOM本身会这样做,如果没有子节点,但我不知道为什么在你的情况下它是这样做的。 如果你想在DOM指针上显式调用Pretty Print。

#include <msxml2.h> 

bool FormatDOMDocument (IXMLDOMDocument *pDoc, IStream *pStream) 
{ 

    // Create the writer 
    CComPtr <IMXWriter> pMXWriter; 
    if (FAILED (pMXWriter.CoCreateInstance(__uuidof (MXXMLWriter), NULL, CLSCTX_ALL))) 
    { 
     return false; 
    } 
    CComPtr <ISAXContentHandler> pISAXContentHandler; 
    if (FAILED (pMXWriter.QueryInterface(&pISAXContentHandler))) 
    { 
     return false; 
    } 
    CComPtr <ISAXErrorHandler> pISAXErrorHandler; 
    if (FAILED (pMXWriter.QueryInterface (&pISAXErrorHandler))) 
    { 
     return false; 
    } 
    CComPtr <ISAXDTDHandler> 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; 
    } 

    CComPtr <ISAXXMLReader> 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))); 
}