属性树:完整路径和名称

时间:2016-09-15 12:28:20

标签: c++ boost boost-propertytree

我想创建一个可以从属性树构造的类,如下例所示:

<?xml version="1.0" encoding="utf-8"?>
<config>
    <name>testing</name>
    <!-- Test property tree -->
    <lambda min="200000" max="200">100</lambda>
...

使用属性树很容易,但是我需要访问子树的两个属性,就像在这个类中一样:

parameter::parameter(boost::property_tree::ptree t)
{
    // Set the value
    value = t.get_value<double>();

    // ?????
    auto nodename = t.something();

    // ?????
    std::string nodepath = t.somethingelse();

    // Get the attributes (or empty)
    auto p = t.get_child("<xmlattr>", boost::property_tree::ptree());

    // If we have attributes, read them
    if (p != boost::property_tree::ptree())
    {
        min = t.get<double>("<xmlattr>.min");
        max = t.get<double>("<xmlattr>.max");

        if (min > max)
            throw std::runtime_error("Min and max values invalid for the parameter " + nodename + ", path: " + nodepath);
    }
    else
    {
        min = +1.0;
        max = -1.0;
    }
}

// ... Someplace else
lambda = parameter(config.get_child("config.lambda"));

在XML中,lambda的mim / max属性无效,我需要抛出一个可以读作的异常

Min and max values invalid for the parameter lambda, path: config.lambda

当然我可以传递字符串,但它会破坏目的。我试过弄乱t的迭代器和data,但什么都没有。

我可以从ptree获取这些值吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我稍微改变了界面,让你不要过早丢弃所需的信息:

<强> Live On Coliru

#include <boost/property_tree/xml_parser.hpp>

using boost::property_tree::ptree;

struct parameter {
    parameter(ptree const& tree, ptree::path_type const& nodepath)
    {
        ptree const& t = tree.get_child(nodepath);
        // Set the value
        value = t.get_value<double>();

        auto nodename = [nodepath] {
            auto copy = nodepath;
            while (!copy.single()) copy.reduce();
            return copy.reduce();
        }();

        // Get the attributes (or empty)
        auto p = t.get_child("<xmlattr>", boost::property_tree::ptree());

        // If we have attributes, read them
        if (p != boost::property_tree::ptree())
        {
            auto min = t.get<double>("<xmlattr>.min");
            auto max = t.get<double>("<xmlattr>.max");

            if (min > max)
                throw std::runtime_error("Min and max values invalid for the parameter " + nodename + ", path: " + nodepath.dump());
        }
        else
        {
            min = +1.0;
            max = -1.0;
        }
    }

  private:
    double min, max;
    double value;
};

int main() {
    ptree config;
    std::ifstream xml("input.txt");
    read_xml(xml, config);

    auto lambda = parameter(config, "config.lambda");
}

打印

terminate called after throwing an instance of 'std::runtime_error'
  what():  Min and max values invalid for the parameter lambda, path: config.lambda