2010-01-27 13 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 बहुत अंतर्दृष्टि नहीं दे रहा है।

मैं कुछ hunches है:

  • एक्सएमएल नहीं अच्छी तरह से बनाई है
  • एक्सएमएल फ़ाइल बहुत बड़ी है (लगभग 120MB)
  • यह एक स्मृति से संबंधित मुद्दा है (प्रक्रिया आकार हो जाता है करने के लिए> 2GB विफलता का समय)
    • एनबी: एक रजिस्ट्री कुंजी प्रक्रिया आकार इस बड़े होने के लिए अनुमति देने के लिए WinXP के लिए, AFAIK स्थापित किया गया है, सबसे बड़ा वैध प्रक्रिया आकार के रूप में, 2 जीबी है)।

कोई भी विचार क्यों इस कॉल में नाकाम रहने के किया जा सकता है के रूप में?

+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 में त्रुटिपूर्ण स्रोत रेखा होगी। nLine और nColumn को पंक्ति संख्या और त्रुटि के कॉलम पर सेट होना चाहिए, हालांकि व्यवहार में इन दोनों को हमेशा विश्वसनीय रूप से सेट नहीं किया जाता है (iirc, यह विशेष रूप से पार्सर/अच्छी तरह से गठित लोगों की बजाय सत्यापन त्रुटियों के लिए सच है)।

+0

सुझाव के लिए धन्यवाद - मैंने त्रुटि निकाली है, और जब भी मैं इसे चलाता हूं तो यह अलग होता है। यह मुझे बताता है कि मैं स्मृति समस्याओं में भाग रहा हूं, न कि विकृत XML। मैंने इसके बारे में एक नया प्रश्न खोला है: http://stackoverflow.com/questions/2152492/maximum-process-sizes-on-32bit-vs-64bit-windows-versions – LeopardSkinPillBoxHat

0

यदि एक्सएमएल फ़ाइल किसी अन्य कार्य या प्रक्रिया द्वारा खोला जाता है तो लोड() विधि फ़ाइल लोड नहीं कर सकता है लेकिन यह नहीं बताता कि लोडिंग विफल हो गई है। मैं इस व्यवहार को एक बग के रूप में मानता हूं।

तो आपको संपत्ति दस्तावेज़ की जांच करना होगा - अगर यह शून्य है, लोड() भी असफल रहा है।

संबंधित मुद्दे

 संबंधित मुद्दे