2016-12-14 52 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