我使用boost::property_tree在我的应用程序中读写XML配置文件。但是当我编写文件时,输出看起来有点难看,文件中有很多空行。问题是它也应该由人类编辑,所以我希望得到更好的输出。
作为一个例子,我写了一个小测试程序:
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
int main( void )
{
using boost::property_tree::ptree;
ptree pt;
// reading file.xml
read_xml("file.xml", pt);
// writing the unchanged ptree in file2.xml
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
write_xml("file2.xml", pt, std::locale(), settings);
return 0;
}
文件. xml包含:
<?xml version="1.0" ?>
<config>
<net>
<listenPort>10420</listenPort>
</net>
</config>
运行程序后,file2.xml包含:
<?xml version="1.0" encoding="utf-8"?>
<config>
<net>
<listenPort>10420</listenPort>
</net>
</config>
除了手动检查输出并删除空行之外,是否有其他方法可以获得更好的输出?
4条答案
按热度按时间pdkcd3nj1#
解决方案是将
trim_whitespace
标志添加到对read_xml
的调用中:这个标志被记录在here中,但是库的当前维护者(Sebastien Redl)非常友好地回答了我并指出了它。
olqngx592#
这个问题已经很老了,但是最近我再次研究了您的问题,因为现在property_tree将换行符转换为
在我看来这是一个bug,因为只包含空格的元素--换行符、空格和制表符,被视为文本元素。trim_whitespace只是一个创可贴,它规范化了property_tree中的所有空格。
我在这里报告了这个bug,并附加了一个.diff来修复Boost 1.59中未使用trim_whitespace时的这种行为:https://svn.boost.org/trac/boost/ticket/11600
5lhxktic3#
对于那些尝试:
在VisualStudio 2013中使用boost-1.60.0编译,您可能会获得:
然后在这里结束:
https://svn.boost.org/trac/boost/ticket/10272
解决方案是在模板中使用std::string。
如下所述:
https://stackoverflow.com/a/35043551/7170333
vql8enpb4#
设置为"trim_whitespace"不是正确答案。如果您不能修剪数据项(在读取时发生),则在读取时修剪空白没有任何用处。
我觉得问题出在这里,在:https://www.boost.org/doc/libs/1_81_0/boost/property_tree/detail/xml_parser_write.hpp
而不是:
也许可以这样说:
这似乎修复了IMO上面看到的"奇怪"行为--作者没有添加空行或"仅空格"行。
或者,读取器在读取节点时可以跳过此空"文本",例如: