2010-01-27 139 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

我不能進入load()來確定它失敗的原因,因爲它是一個COM調用。

該方法的MSDN page似乎沒有給出很多見解。

我有一些預感:

  • XML是沒有很好地形成
  • XML文件過大(約120MB)
  • 這是一個內存相關的問題(進程大小到達> 2GB在故障時間)
    • 注:註冊表項已被設置爲允許進程大小是這個大,作爲最大有效處理大小的WinXP,據我所知,是2GB)。

任何想法,爲什麼這個調用可以失敗?

+2

你嘗試過'parseError'嗎? http://msdn.microsoft.com/en-us/library/ms756041%28VS.85%29.aspx – 2010-01-27 02:47:12

回答

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 2010-01-28 05:25:56

0

如果XML文件被另一個Task或Proccess打開,則Load()方法 無法加載文件,但它不會聲明加載失敗。 我認爲這是一個錯誤。

所以你必須檢查Property documentElement - 如果它爲null,load()也失敗了。