2009-10-23 2 views
0
나는 큰 XML 문서를로드하려면 다음 코드를 사용하고

(5 ~ MB)에 의해 절단되고있다 : 나는 것을 찾는거야큰 XML 파일은 MSXML4/FreeThreadedDOMDocument40 (COM 문자열 상호 운용성 문제)

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의 내용이 잘립니다 (예외/실패한 HResults는 없습니다)

이유는 무엇입니까? 당신은 단지 <xml></xml> 요소 (5 ~ 메가 바이트를해야한다)의 큰 XML 파일을 만들어이 자신을 시도 할 수 있습니다

UPDATE : 업데이트는 MSXML 6도 false로 비동기를 설정하고 get_nodeValue를 사용하여, 차이를하지 사용하는/get_text는 아무런 차이가 없었습니다. (샘플 업데이트 됨)

문서의 끝에 배치 된 노드에 대해 selectSingleNode를 사용하면 정상적으로 작동했음을 알았습니다. 문서가 성공적으로로드되고 대신 텍스트를 가져 오는 것으로 나타났습니다. 단일 노드의 경우. 나는 아직이 문제가 인터넷에있는 다른 누구를 찾을 수 없기 때문에 당황 스럽다.

업데이트 2 :이 문제는 COM interop 자체와 관련이있는 것 같습니다. 동일한 작업을 수행하고 COM 개체로 노출시킨 간단한 C# 클래스를 만들었습니다. 나는 XML이 C# 응용 프로그램에서 훌륭하지만, C++ 응용 프로그램의 디버거에서 보면 MSXML을 사용할 때와 똑같이 보입니다.

답변

0

필자는 어리 석음의 희생자였습니다. 실제로 XML/문자열은 잘리지 않았지만 Visual Studio의 뷰어는 단순히 거짓말이었습니다.

문자열을 파일로 출력하면 문자열이 모두 그대로 있어야합니다.