アプリケーションでXML構成ファイルを読み書きするためにboost :: property_treeを使用しています。しかし、ファイルを書き込むと、出力はファイル内に多数の空の行があり、見苦しく見えます。問題は、それも人間によって編集されることになっているので、より良い出力を取得したいのですが。
例として、私は小さなテストプログラムを書きました:
#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;
}
file.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>
出力を手動で確認して空の行を削除する以外に、より良い出力を得る方法はありますか?
解決策は、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;
}
フラグは here で文書化されていますが、ライブラリ(Sebastien Redl)の現在のメンテナは、答えて私に指摘するのに十分親切でした。
この質問はかなり古いですが、property_treeが改行を
私の意見では、これはバグです。空白のみを含む要素(改行、スペース、タブ)はテキスト要素として扱われるからです。 trim_whitespaceは単なる帯状のものであり、property_tree内のすべての空白を正規化します。
私はここでバグを報告し、trim_whitespaceが使用されない場合のBoost 1.59でこの動作を修正するために.diffも添付しました: https://svn.boost.org/trac/boost/ticket/116
しようとしている人のために:
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
VisualStudio 2013でboost-1.60.0を使用してコンパイルすると、次のようになります。
vmtknetworktest.cpp(259) : see reference to class template instantiation 'boost::property_tree::xml_parser::xml_writer_settings<char>' being compiled
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2039: 'value_type' : is not a member of '`global namespace''
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C2146: syntax error : missing ';' before identifier 'Ch'
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(38): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(40): error C2061: syntax error : identifier 'Ch'
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C2146: syntax error : missing ';' before identifier 'indent_char'
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(49): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2825: 'Str': must be a class or namespace when followed by '::'
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2039: 'size_type' : is not a member of '`global namespace''
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C2146: syntax error : missing ';' before identifier 'indent_count'
install\include\boost-1_60\boost/property_tree/detail/xml_parser_writer_settings.hpp(50): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
vmtknetworktest.cpp(259): error C2661: 'boost::property_tree::xml_parser::xml_writer_settings<char>::xml_writer_settings' : no overloaded function takes 3 arguments
その後、ここに行きます:
https://svn.boost.org/trac/boost/ticket/10272
機能することがわかった解決策は、テンプレートでstd :: stringを使用することです。
pt::write_xml(file_name, params, std::locale(), pt::xml_writer_make_settings< std::string >(' ', 4));
ここで説明するように: