2010-01-27 35 views
5

Tôi đang cố gắng gỡ lỗi những gì dường như là một vấn đề phân tích cú pháp XML trong mã của tôi. Chúng tôi đã tách nó xuống để đoạn mã sau:Làm cách nào để xác định tại sao cuộc gọi đến IXMLDOMDocument :: load() không thành công?

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

Lưu ý:m_pXmlDoc là loại CComPtr<IXMLDOMDocument>.

Dường như cuộc gọi tới IXMLDOMDocument::load() (được đánh dấu bằng *) không thành công - IOW, nó đang trả về S_FALSE.

Tôi không thể bước vào load() để xác định lý do tại sao nó không thành công vì đây là cuộc gọi COM.

MSDN page cho phương pháp này dường như không mang lại nhiều thông tin chi tiết.

Tôi có một vài linh cảm:

  • XML được tạo không đúng
  • Các tập tin XML là quá lớn (khoảng 120MB)
  • Đó là một vấn đề bộ nhớ liên quan đến (kích thước quá trình được đến> 2GB tại thời điểm thất bại)
    • NB: Một khóa registry đã được thiết lập để cho phép kích thước quá trình trở thành lớn này, như kích thước quá trình hợp lệ lớn nhất cho WinXP, AFAIK, là 2GB).

Bất kỳ ý tưởng nào về lý do tại sao cuộc gọi này có thể bị lỗi?

+2

Bạn đã thử 'parseError' chưa? http://msdn.microsoft.com/en-us/library/ms756041%28VS.85%29.aspx –

Trả lời

9

Mã sau sẽ tìm nạp lỗi trình phân tích cú pháp cụ thể từ DOM và vị trí của nó trong XML nguồn.

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 sẽ được lấp đầy với thông báo lỗi. sSource sẽ chứa dòng nguồn sai trong XML. nLinenColumn sẽ được đặt thành số dòng và cột của lỗi, mặc dù trong thực tế hai không phải lúc nào cũng được đặt một cách đáng tin cậy (iirc, điều này đặc biệt đúng với các lỗi xác thực, chứ không phải là các trình phân tích cú pháp/định dạng tốt).

+0

Cảm ơn đề xuất - Tôi đã trích xuất lỗi và dường như nó khác nhau mỗi khi tôi chạy nó. Điều này gợi ý với tôi rằng tôi đang gặp vấn đề về bộ nhớ, không phải là XML không đúng định dạng. Tôi đã mở ra một câu hỏi mới về điều này: http://stackoverflow.com/questions/2152492/maximum-process-sizes-on-32bit-vs-64bit-windows-versions – LeopardSkinPillBoxHat

0

Nếu tệp XML được mở bởi một tác vụ khác hoặc truy nhập phương thức tải() không thể tải tệp nhưng không cho biết tải không thành công. Tôi coi hành vi này là lỗi.

Vì vậy, bạn phải kiểm tra tài liệu Thuộc tínhElement - nếu nó rỗng, tải() cũng không thành công.

Các vấn đề liên quan