2010-01-27 20 views
5

Sto cercando di eseguire il debug di quello che sembra essere un problema di analisi XML nel mio codice. Ho isolato verso il basso per il seguente frammento di codice:Come posso determinare il motivo per cui una chiamata a IXMLDOMDocument :: load() non riesce?

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; 
} 

Nota:m_pXmlDoc è del tipo CComPtr<IXMLDOMDocument>.

Sembra che la chiamata a IXMLDOMDocument::load() (contrassegnata con *) non sia riuscita - IOW, restituisce S_FALSE.

Non riesco a entrare in load() per determinare perché non funziona, poiché si tratta di una chiamata COM.

Il metodo MSDN page per questo metodo non sembra fornire molte informazioni.

Ho alcune intuizioni:

  • L'XML non è ben formato
  • Il file XML è troppo grande (circa 120MB)
  • è un problema relativo alla memoria (la dimensione di processo arriva a> 2 GB al momento del fallimento)
    • NB: una chiave di registro è stata impostata per consentire la dimensione processo sia questo grande, come il più grande formato di processo valido per WinXP, per quanto ne so, è 2 GB).

Tutte le idee sul perché questa chiamata potrebbe essere fallendo?

+2

Hai provato 'parseError'? http://msdn.microsoft.com/en-us/library/ms756041%28VS.85%29.aspx –

risposta

9

Il seguente codice recupera l'errore parser specifico dal DOM e il suo percorso nell'XML di origine.

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 verrà riempito con il messaggio di errore. sSource conterrà la riga di origine errorneous nell'XML. nLine e nColumn dovrebbero essere impostati sul numero di riga e sulla colonna dell'errore, sebbene in pratica questi due non siano sempre impostati in modo affidabile (iirc, questo è particolarmente vero per gli errori di validazione, piuttosto che per quelli di parser/well-formedness).

+0

Grazie per il suggerimento - Ho estratto l'errore, e sembra essere diverso ogni volta che lo eseguo. Questo mi suggerisce che sto incontrando problemi di memoria, non XML malformato. Ho aperto una nuova domanda al riguardo: http://stackoverflow.com/questions/2152492/maximum-process-sizes-on-32bit-vs-64bit-windows-versions – LeopardSkinPillBoxHat

0

Se il file XML viene aperto da un'altra attività o Proccess il metodo Load() non può caricare il file ma non indica che il caricamento non è riuscito. Considero questo comportamento come un bug.

Quindi è necessario controllare la proprietà documentElement - se è nullo, anche load() non è riuscito.

Problemi correlati