2012-08-04 22 views
1

我想用C++輸入和使用rapidxml

xml_document<> doc; 
ifstream myfile("map.osm"); 
doc.parse<0>(myfile); 

在這一行做這樣的事情使用rapidxml並收到以下錯誤

多個標記解析 - 參數無效「考生:void parse(char *)' - Symbol'parse'無法解析

文件大小可能高達幾兆字節。

請幫助

回答

0

你必須將文件加載到一個null作爲這裏的官方文檔中指定的第一個終止字符緩衝區。

http://rapidxml.sourceforge.net/manual.html#classrapidxml_1_1xml__document_8338ce6042e7b04d5a42144fb446b69c_18338ce6042e7b04d5a42144fb446b69c

剛剛看了你的文件的內容到一個char數組,使用這個數組傳遞給xml_document::parse()功能。

如果您正在使用ifstream,你可以使用類似下面的讀取整個文件內容的緩衝區

ifstream file ("test.xml"); 
if (file.is_open()) 
{ 
    file.seekg(0,ios::end); 
    int size = file.tellg(); 
    file.seekg(0,ios::beg); 

    char* buffer = new char [size]; 

    file.read (buffer, size); 
    file.close(); 

    // your file should now be in the char buffer - 
    // use this to parse your xml  

    delete[] buffer; 
} 

請注意,我還沒有編譯上面的代碼,只是從內存中寫,但這是粗略的想法。有關確切的詳細信息,請參閱ifstream的文檔。無論如何,這應該有助於你開始。

+0

嘿,非常感謝它的工作。但並不完美。有些時候它工作正常,並且緩衝區完全從文件獲取輸入,但有些時候它在緩衝區末尾有一些垃圾值,這是語句 doc.parse <0>(buffer); 失敗,並在運行未編譯時出現以下錯誤。 「此應用程序已請求運行時終止它在一個不尋常的方式 請與應用程序的支持團隊以獲取更多信息 終止叫做拋出‘rapidxml :: PARSE_ERROR’ 什麼()的一個實例之後:預期<」 請幫忙 – 2012-08-05 18:06:33

+0

是的,你需要從解析中捕捉異常。如果你的文件中有一些意外的垃圾,解析會拋出錯誤。如果您使用try/catch塊來捕獲該錯誤並處理它。並且不要忘記,當你將文件讀入char緩衝區時,應該確保緩衝區像文檔所說的那樣終止。這意味着將緩衝區創建爲比文件大一個字節,將整個緩衝區memset設爲零,然後將文件讀入緩衝區。當然,如果你的xml文件包含錯誤,那麼你就無能爲力 - 這就是爲什麼這個異常拋出 – mathematician1975 2012-08-05 19:09:57

+0

感謝很多數學家1975。問題在於緩衝區的零終止。我在最後將最後一個字符設置爲零,它工作。 – 2012-08-06 10:33:28