Большие XML-файлы усекаются с помощью MSXML4 / FreeThreadedDOMDocument40 (проблема взаимодействия строк COM) - PullRequest
0 голосов
/ 23 октября 2009

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

1 Ответ

0 голосов
/ 23 октября 2009

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

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

...