Re[4]: Вопрос в эту тему
От: Maslex  
Дата: 26.09.05 08:09
Оценка:
Ну вставлю и свои пять копеек.
Вот смотрю и диву даюсь, сколько народу мучается с тем чтобы нормально XML-ку сохранить.
Когда-то и я мучался.
Вот мой вариант, с использованием IMXWriter, который кстати позволяет сохранять данные в любой кодировке.
В примере ниже: сохраняется в строку в UTF-8 кодировке.

HRESULT XML2UTF8Encoding(const CString& szBody, std::string& szRequest)
{
   IXMLDOMDocument2Ptr pIXMLDOMDocument;
   HRESULT hr = pIXMLDOMDocument.CreateInstance(__uuidof(DOMDocument40));
   if(FAILED(hr))
      return hr;

   pIXMLDOMDocument->resolveExternals = VARIANT_FALSE;
   pIXMLDOMDocument->async = VARIANT_FALSE;
   pIXMLDOMDocument->validateOnParse = VARIANT_FALSE;

   if(::loadXML(pIXMLDOMDocument, _bstr_t(szBody)) != VARIANT_TRUE)
   {
      return E_FAIL;
   }

   ISAXXMLReaderPtr pReader;
   hr = pReader.CreateInstance(__uuidof(SAXXMLReader40));

   IMXWriterPtr pWriter;
   hr = pWriter.CreateInstance(__uuidof(MXXMLWriter40));
   if(FAILED(hr))
      return hr;

   //Set properties on the XML writer.
   pWriter->byteOrderMark = VARIANT_FALSE;
   pWriter->omitXMLDeclaration = VARIANT_FALSE;
   pWriter->indent = VARIANT_TRUE;
   pWriter->encoding = "UTF-8";
   
   //Set the XML writer to the SAX content handler.
   pReader->putContentHandler((ISAXContentHandlerPtr)pWriter);
   pReader->putDTDHandler((ISAXDTDHandlerPtr)pWriter);
   pReader->putErrorHandler((ISAXErrorHandlerPtr)pWriter);

   CComPtr<IStream> m_spIStream;
   hr = CreateStreamOnHGlobal(NULL, TRUE, &m_spIStream);
   if(FAILED(hr))
      return hr;

   pWriter->output = _variant_t(m_spIStream);
   hr = pReader->parse((_variant_t)pIXMLDOMDocument.GetInterfacePtr());
   if(FAILED(hr))
      return hr;
   
   LARGE_INTEGER iLNull = {0, 0};
   ULARGE_INTEGER uLLen = {0, 0};
   //Take data size...
   hr = m_spIStream->Seek(iLNull, STREAM_SEEK_CUR, &uLLen);
   if(FAILED(hr))
      return hr;
   //IStream -> to begin...
   hr = m_spIStream->Seek(iLNull, STREAM_SEEK_SET, NULL);
   if(FAILED(hr))
      return hr;
   //Size of buffer...
   DWORD Size = (DWORD)uLLen.QuadPart;
   
   char * szBuf = new char[Size+1];
   m_spIStream->Read(szBuf, Size, NULL);
   szBuf[Size] = 0;
   szRequest = szBuf;
   delete []szBuf;
   return NOERROR;
}
... << RSDN@Home 1.2.0 alpha rev. 605>>
WBR,
Maslex
Re[2]: MSXML - сохранение с отступами - 1
От: Аноним  
Дата: 28.09.05 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

OE>>
OE>>        CComBSTR bstrXML( L"" );
OE>>        hr = spDomDocument->get_xml( &bstrXML ); // CComPtr<IXMLDOMDocument> spDomDocument;

OE>>        // вставляем переводы строки
OE>>        CString sXml = W2A( bstrXML );
OE>>        sXml.Replace( "><", ">\n<" );OE>        bstrXML = sXml.GetBuffer( 0 );

OE>>        // загружаем взад
OE>>        hr = spDomDocument->loadXML( bstrXML, &bSuccess );

OE>>        // сохраняем файлы
OE>>        hr = spDomDocument->save( CComVariant( L"file.xml") );
OE>>


OE>>получается чудненько структурированный документ со всеми отступами.


А>Откуда берутся отступы, если вставляются только переводы строк?


Эээээй!!? Никто не знает или все проморозились?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.