Boost.PropertyTree: XML 出力

序論

Boost.PropertyTree木構造のライブラリーで,XML, JSON, INI, INFO のパーサが提供されている.

Boost.PorpertyTree を利用して W3Schools の XML Attributes

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

を出力する.

方法

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

int main()
{
    // create an empty property tree
    boost::property_tree::ptree pt;

    // create the root element
    boost::property_tree::ptree& root = pt.put("messages", "");

    // add child elements
    // absolute path
    pt.put("messages.note.<xmlattr>.id", "501");
    pt.put("messages.note.to", "Tove");
    pt.put("messages.note.from", "Jani");
    pt.put("messages.note.heading", "Reminder");
    pt.put("messages.note.body", "Don't forget me this weekend!");
    // relative path
    boost::property_tree::ptree& child = root.add("note", "");
    child.put("<xmlattr>.id", "502");
    child.put("to", "Jani");
    child.put("from", "Tove");
    child.put("heading", "Re: Reminder");
    child.put("body", "I will not");

    // output
    boost::property_tree::write_xml("messages.xml", pt, std::locale(),
        boost::property_tree::xml_writer_make_settings<std::string>(' ', 2));

    return 0;
}

出力:

<?xml version="1.0" encoding="utf-8"?>
<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don&apos;t forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

要素の追加

要素を追加するには putadd を使う.引数はパスと値.指定した値がすでにある場合 put は上書きするが, add は別のノードを追加する (How to Access Data in a Property Tree - Two Ways of Putting Data).

<xmlattr> で属性,<xmlcomment> でコメント,<xmltext> でテキストが追加できる (How to Populate a Property Tree - XML Parser).

boost::property_tree::write_xml

第1引数は std::basic_ostreamstd::string (ファイル名).property_tree より後の引数は省略可能.詳細は boost/property_tree/xml_parser.hpp - 1.58.0 参照.

boost::property_tree::xml_writer_make_settings

xml_writer_make_settingsxml_writer_settings を生成する関数. xml_writer_make_settings の引数はインデント文字,インデント幅,XML文字コード; デフォルトは ␣, 0, utf-8 (boost/property_tree/detail/xml_parser_writer_settings.hpp - 1.58.0).std::string と型指定しないとエラーになる.

write_xml の呼び出しでは省略可だが,設定しないとインデント・改行なしの XML が出力される:

<?xml version="1.0" encoding="utf-8"?>
<messages><note id="501"><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don&apos;t forget me this weekend!</body></note><note id="502"><to>Jani</to><from>Tove</from><heading>Re: Reminder</heading><body>I will not</body></note></messages>

ルート要素

複数のルート要素を追加しても Boost.PropertyTree は何も言わないので,自己責任で管理すること.

参考

Boost

XML