سؤال

باستخدام MSXML عبر C ++، عندما اتصل IXMLDOMDocument::save, ، سوف تحصل عناصر XML الفارغة على علامة النهاية، مثل هذا:

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

لكنني أريد أن أنقذ هذا:

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

ما الذي يجب علي فعله لإنجاز ذلك؟

هل كانت مفيدة؟

المحلول

دوم نفسه يفعل ذلك إذا لم تكن هناك عقد أطفال لكنني لا أعرف لماذا في حالتك تفعل مثل هذا. إذا كنت ترغب في القيام بدعوة صراحة طباعة جميلة على مؤشر 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)));
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top