2011-09-26 252 views
0
 ifstream fin("tree.xml"); 
    if (fin.fail()) return 1; 

    fin.seekg(0, ios::end); 
    size_t length = fin.tellg(); 
    fin.seekg(0, ios::beg); 
    char* buffer = new char[length + 1]; 
    fin.read(buffer, length); 
    buffer[length] = '\0'; 

    fin.close(); 

    xml_document<> doc; 
    doc.parse<parse_full>(buffer); 

// doc.parse<0>(buffer); 

    delete [] buffer; 

    cout << "The first node is '" << doc.first_node()->name() << "'\n"; 
    for (xml_node<>* n = doc.first_node("card")->first_node(); n; 
     n = n->next_sibling()) 
    { 
     char* v = n->value(); 
     if (!v || !*v) v = "(empty)"; 
     cout << n->name() << " : " << v << '\n'; 
    } 

這是我所使用RapidXML XML解析編寫的代碼,但它拋出異常「的存儲位置0x0011fc20 rapidxml :: PARSE_ERROR ..」請提出這方面的任何修補程序。感謝名單RapidXML拋出異常

+0

你有沒有與像xmllint --validate一些外部工具驗證你的XML輸入? – thiton

+0

不錯,但它的一個小XML文件 「<?xml version =」1.0「?> <目名稱= 「mesh_root」> \t <! - 這裏是一個網狀節點! - > \t一些文本 \t <![CDATA [someothertext]]> \t一些文字 \t <節點attR1位= 「VALUE1」 attR2位= 「VALUE2」/> \t <節點attR1位= 「VALUE2」> \t \t \t <?包括somedata?>」 – Sokio

回答

1

您可以通過查看這個鏈接http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1parse__error

特別要明確到底是什麼原因造成這種(粗體文字是我的重點)

類rapidxml :: PARSE_ERROR

定義在rapidxml.hpp

說明

解析錯誤異常。當發生錯誤 時,解析器拋出此異常。使用什麼()函數來獲取人類可讀的錯誤消息。使用 其中()函數獲取指向源文本中檢測到 錯誤的位置的指針。

這將至少讓你發現是什麼導致異常以及位置。此外,您的代碼確實存在可能導致問題的問題。這是從剖析功能http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c

的rapidXML描述粗體文本強調的是我拍的

解析根據給定的標誌零結尾的XML字符串。通過 字符串將被解析器修改,除非使用 rapidxml :: parse_non_destructive標誌。 字符串在文檔的生存期內必須持續 。如果發生錯誤,將會拋出 rapidxml :: parse_error異常。

但在你的代碼

xml_document<> doc; 
doc.parse<parse_full>(buffer); 
// doc.parse<0>(buffer); 

delete [] buffer; 

cout << "The first node is '" << doc.first_node()->name() << "'\n"; 

要刪除包含您的字符串事後調用doc對象上的功能字符緩衝區。這違反了上述文件。我不確定這是否是您的例外的確切原因,但肯定刪除該緩衝區會導致問題。我建議使用try/catch塊來捕獲parse_error異常,然後使用where()what()函數來查明錯誤。在完成對doc對象的調用函數之後,也可以嘗試將刪除語句移到代碼的末尾,因爲這也可能導致問題。

0

你解析DOM對象的文檔是根據你的緩衝區的內存,所以不要刪除緩存或刪除剛剛退出前