2009-04-08 4 views
1

Использование MSXML с помощью C++, когда я называю IXMLDOMDocument::save, пустые элементы XML получит конечный тег, например:Сохранение IXMLDOMDocument без конечного тега

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

Но я хочу сохранить как это:

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

Что мне нужно сделать для этого?

ответ

1

DOM сам делает это, если нет дочерних узлов, но я не знаю, почему в вашем случае это происходит так. Если вы хотите явно называть Pretty Print на указателе DOM.

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