Я использую следующий код для загрузки большого Xml документа (~ 5 МБ):Больших файлы Xml в настоящее время усечены Msxml4/FreeThreadedDOMDocument40 (COM Interop строка выпуск)
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 усечено (нет исключений/неудачных результатов)
Кто-нибудь знает почему? Вы можете попробовать это самостоятельно, просто создавая большой Xml файл только <xml></xml>
элементов (~ 5 MB должны это сделать)
UPDATE: Обновление использовать MSXML 6 не имеет никакого значения, а также установка Async к ложным и использованием get_nodeValue/get_text не имеет значения (образец обновлен)
Я заметил, что если бы я сделал selectSingleNode для узла, расположенного в конце документа, он работал нормально - кажется, что документ загружен успешно, и проблема заключается в получении текста для одного узла. Однако я недоумеваю, так как я еще не нашел кого-то еще в Интернете, имеющего эту проблему.
ОБНОВЛЕНИЕ 2: Проблема, похоже, связана с самим COM-взаимодействием - я создал простой класс C#, который делает то же самое и выставил его как COM-объект. Я вижу, что, хотя Xml отлично работает в моем приложении C#, к тому моменту, когда я смотрю на него в своем отладчике в приложении C++, он выглядит так же, как при использовании MSXML.