boost :: property_tree XML漂亮打印

fok*_*oke 31 c++ boost boost-propertytree

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

file.xml包含:

<?xml version="1.0" ?>
<config>
    <net>
        <listenPort>10420</listenPort>
    </net>
</config>
Run Code Online (Sandbox Code Playgroud)

运行程序后,file2.xml包含:

<?xml version="1.0" encoding="utf-8"?>
<config>



    <net>



        <listenPort>10420</listenPort>
    </net>
</config>
Run Code Online (Sandbox Code Playgroud)

有没有办法获得更好的输出,除了手动通过输出和删除空行?

fok*_*oke 43

解决方案是将trim_whitespace标志添加到调用read_xml:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>

int main( void )
{
    // Create an empty property tree object
    using boost::property_tree::ptree;
    ptree pt;

    // reading file.xml
    read_xml("file.xml", pt, boost::property_tree::xml_parser::trim_whitespace );

    // 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;
}
Run Code Online (Sandbox Code Playgroud)

这里记录这面旗帜,但是图书馆的当前维护者(Sebastien Redl)非常友好地回答并指出了它.

  • 奇怪的是,需要更改*read*设置才能获得此功能(特别是在@AndreasHaferburg评论之后).无论如何在当前版本的Boost中,需要使用`xml_writer_settings <std :: string>`(而不是`char`). (8认同)
  • 警告:trim_whitespace 不仅会修剪 XML 中的空格,还会修剪任何不包含其他元素的元素中的空格:“&lt;a&gt;xx &lt;/a&gt;”会被读取为“&lt;a&gt;xx&lt;/a&gt;” `。 (2认同)