2010-01-27 2 views
5

내 코드에서 XML 구문 분석 문제로 보이는 것을 디버깅하려고합니다. 나는 다음과 같은 코드로 아래로 격리했다 :IXMLDOMDocument :: load()에 대한 호출이 실패하는 이유를 어떻게 알 수 있습니까?

HRESULT 
CXmlDocument::Load(IStream* Stream) 
{ 
    CComVariant xmlSource(static_cast<IUnknown*>(Stream)); 
    VARIANT_BOOL isSuccessful; 
    * HRESULT hr = m_pXmlDoc->load(xmlSource, &isSuccessful); 
    return (hr == S_FALSE) ? E_FAIL : hr; 
} 

참고 :m_pXmlDoc는 유형 CComPtr<IXMLDOMDocument>이다.

IXMLDOMDocument::load() (*로 표시)에 대한 호출이 실패 함 - IOW, 이는 S_FALSE입니다.

COM 통화이므로 load()으로 들어가서 실패 이유를 판단 할 수 없습니다.

이 방법의 경우 MSDN page은 많은 통찰력을 제공하지 않는 것 같습니다.

내가 몇 예감이 : XML이 XML 파일이 너무 큰
  • 잘 형성되지

    • (약 120메가바이트)
    • 그것은 메모리 관련 문제를 (프로세스 크기 도착에> 2기가바이트 실패시)에
      • NB : 레지스트리 키가 AFAIK, WINXP의 가장 큰 유효한 프로세스 크기로, 프로세스 크기가이 클 수 있도록 설정되어, 2GB입니다. 왜이 호출이 실패 할 수에 관해서는

    어떤 아이디어?

  • +2

    'parseError' 해봤습니까? http://msdn.microsoft.com/en-us/library/ms756041%28VS.85%29.aspx –

    답변

    9

    다음 코드는 DOM과 XML 소스의 특정 구문 분석기 오류를 가져옵니다.

    CComPtr<IXMLDOMParseError> pError; 
    CComBSTR sReason, sSource; 
    long nLine = 0, nColumn = 0; 
    
    m_pXmlDoc->get_parseError(&pError); 
    if(pError) 
    { 
        pError->get_reason(&sReason); 
        pError->get_srcText(&sSource); 
        pError->get_line(&nLine); 
        pError->get_linepos(&nColumn); 
    } 
    

    sReason은 오류 메시지로 채워집니다. sSource은 XML에 오류가있는 소스 행을 포함합니다. nLinenColumn은 실제로는이 두 가지가 항상 안정적으로 설정되지는 않지만 (물론 iirc, 이는 특히 구문 분석기/올바른 형식이 아닌 유효성 검사 오류에 해당 함) 오류의 줄 번호와 열로 설정해야합니다.

    +0

    제안 해 주셔서 감사합니다. 오류를 추출했으며 실행 할 때마다 다른 것으로 보입니다. 이것은 나에게 잘못된 형식의 XML이 아니라 메모리 문제에 부딪치고 있음을 보여줍니다. 이에 대한 새로운 질문을 열었습니다. http://stackoverflow.com/questions/2152492/maximum-process-sizes-on-32bit-vs-64bit-windows-versions – LeopardSkinPillBoxHat

    0

    다른 작업 또는 프로세스에서 XML 파일을 연 경우 Load() 메서드 은 파일을로드 할 수 없지만로드에 실패했음을 나타내지는 않습니다. 이 동작을 버그로 생각합니다.

    그래서 documentElement 속성을 확인해야합니다. null 인 경우 load()도 실패했습니다.

    관련 문제