2016-12-14 141 views
0

我使用boost::property_tree來讀取和寫入xml配置文件。我想更改代碼中某些標記的值,並將它們寫回文件,並使用一些合理的xml格式(新行,縮進等)。Boost屬性樹(XML)刪除空行

目前我使用

std::fstream fs("filename"); 
boost::property_tree::ptree pt; 
bpt::xml_parser::read_xml(fs,pt); 

// replace value 
pt.erase("tagname"); 
pt.put("tagname",newval); 

bpt::xml_parser::xml_writer_settings<char> xmlstyle(' ',4); 
bpt::xml_parser::write_xml("filename",pt,std::locale(),xmlstyle); 

但似乎每一個標籤被刪除時,會留下一個空白行和一些迭代之後的XML變得不可讀。有沒有辦法從屬性樹本身或從生成的xml文件使用boost刪除空行?

我知道還有其他方法通過再次讀取和解析整個文件來刪除換行符,但我希望能夠更方便地使用一行代碼。

回答

0

好了,它看起來像答案是已經在那裏對堆棧溢出,我只是還沒有發現它(新行並沒有在帖子中提到的)

boost::property_tree XML pretty printing

的解決方案是文件與boost::property_tree::xml_parser::trim_whitespace

0

不提升,但特別是空行。 您可以使用輸出std::regex_replace()之前,它被寫入到文件,刪除空行,這樣

std::regex_replace(std::ostreambuf_iterator<char>(fout), text.begin(), text.end(), std::regex("(\\n+)"), "\n"); 

隨着fout作爲文件輸出流並text爲輸出數據爲std::string

這會用一個換行符替換每一個換行符,然後是換行符之間的任何字符。

+0

我看你的正則表達式將如何取代冗餘的新行,如果你有一個文件輸出流和文本給出的字符串。但據我瞭解,我沒有上述代碼示例中的任何一個,那麼如何使用我的問題中的示例代碼進行此項工作? – untergam

+0

我看到你已經找到了解決方案,但我仍然要詳細說明這個問題,因爲它在某些時候可能會有用。您首先將文件內容解壓縮到「std :: string text」中,然後聲明一個「std :: stringstream sstream」。然後你調用上面的函數,但傳遞字符串流而不是文件流。最後,你用字符串流而不是文件流調用'read_xml()'。 – FallenWarrior