Ну вставлю и свои пять копеек.
Вот смотрю и диву даюсь, сколько народу мучается с тем чтобы нормально 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>>
Здравствуйте, Аноним, Вы писали:
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>>получается чудненько структурированный документ со всеми отступами.
А>Откуда берутся отступы, если вставляются только переводы строк?
Эээээй!!? Никто не знает или все проморозились?