rapidxml使用

string 被rapidxml截斷

string str = "<Person><Name>test</Name><ID>2</ID><Name>police</Name></Person>";

    xml_document<> doc;
    doc.parse<0>( const_cast<char*>(str.c_str()) );

執行上面一段代碼,沒有任何問題。但若再次使用str時就會發現被rapidxml截斷了,大家可以加斷點看一下。

rapidxml添加屬性的內存分配問題
今天在用rapidxml生成xml的時候碰到了一個奇怪的問題

rapidxml::xml_node<>* srvnode = doc.allocate_node(rapidxml::node_element,iter->m_name.c_str(),"");  
srvnode->append_attribute(doc.allocate_attribute("ip",iter->m_ip.c_str()));  
srvnode->append_attribute(doc.allocate_attribute("ftpport",toString(iter->m_ftpport).c_str()));  

生成的xml,其他地方都正常,就“ftpport”的屬性總是顯示亂碼,開始以爲是toString函數的問題,但是我換了一種轉換方式後這個問題依然存在,同時我調試的時候看到的toString
的返回值也正常,最後和同時討論後,他給我解釋rapidxml的函數在創建新節點或者屬性的時候,傳入的參數要麼是由內部分配器分配的內存要麼應該指向一塊短期內不會被釋放的內存。
原來如此,於是我改了代碼之後

rapidxml::xml_node<>* srvnode = doc.allocate_node(rapidxml::node_element,iter->m_name.c_str(),"");  
srvnode->append_attribute(doc.allocate_attribute("ip",iter->m_ip.c_str()));  

char* port = doc.allocate_string(toString(iter->m_ftpport).c_str());  
srvnode->append_attribute(doc.allocate_attribute("ftpport",port));

亂碼的問題果然消失了,原來allocate_attribute方法創建一個屬性的時候,attribute的m_value指針只是簡單的指向了一塊內存地址,在後期將doc寫入文件,會將attribute轉化爲字符串,如果此時m_value指向的地址內存被釋放的話,那麼就會出現我先的問題了。所以我的解決方案就是用rapidxml自己的內存池分配一塊內存,保存m_value指向的值,這樣就OK了。

寫在這裏純粹是做個記錄,希望對某些同志也有幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章