Я использую следующий код для загрузки большого XML-документа (~ 5 МБ):
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize(NULL);
HRESULT hr;
CComPtr< IXMLDOMDocument > spXmlDocument;
hr = spXmlDocument.CoCreateInstance(__uuidof(FreeThreadedDOMDocument60)), __uuidof(FreeThreadedDOMDocument60);
if(FAILED(hr)) return FALSE;
spXmlDocument->put_preserveWhiteSpace(VARIANT_TRUE);
spXmlDocument->put_async(VARIANT_FALSE);
spXmlDocument->put_validateOnParse(VARIANT_FALSE);
VARIANT_BOOL bLoadSucceeded = VARIANT_FALSE;
hr = spXmlDocument->load( CComVariant( L"C:\\XMLFile1.xml" ), &bLoadSucceeded );
if(FAILED(hr) || bLoadSucceeded==VARIANT_FALSE) return FALSE;
CComVariant bstrDoc;
hr = spXmlDocument->get_nodeValue(&bstrDoc);
CComPtr< IXMLDOMNode > spNode;
hr = spXmlDocument->selectSingleNode(CComBSTR(L"//SpecialNode"), &spNode );
}
Я обнаружил, что содержимое bstrDoc урезано (исключений / неудачных HR-результатов нет)
Кто-нибудь знает почему? Вы можете попробовать это самостоятельно, просто создав большой XML-файл, состоящий всего из <xml></xml>
элементов (~ 5 МБ должно сделать это)
ОБНОВЛЕНИЕ: Обновление для использования MSXML 6 не изменило, также установив для Async значение false и использование get_nodeValue / get_text не изменило (пример обновлен)
Я заметил, что если я выбрал selectSingleNode для узла, размещенного в конце документа, он работал нормально - похоже, что документ загружается успешно, и вместо этого возникает проблема с получением текста для одного узла. Однако я озадачен тем, что еще не нашел кого-то еще в интернете с этой проблемой.
ОБНОВЛЕНИЕ 2: Проблема, по-видимому, связана с самим взаимодействием COM - я создал простой класс C #, который делает то же самое, и выставил его как объект COM. Я вижу, что хотя Xml в моем приложении C # работает нормально, к тому времени, когда я смотрю на него в своем отладчике в приложении C ++, он выглядит точно так же, как и при использовании MSXML.