2009-10-23 2 views
0

Я использую следующий код для загрузки большого 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.

ответ

0

Похоже, я был жертвой своей собственной глупости - строки Xml/на самом деле не были усечены, зритель в Visual Studio просто лгал мне.

Вывод строк в файл показал, что строки были такими, какими они должны быть.