属性树:完整的路径和名称

Property tree: complete path and name

本文关键字:路径 属性      更新时间:2023-10-16

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

<?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中获得这些值吗?

谢谢!

我会稍微打乱一下界面,这样你就不会过早地丢掉你需要的信息:

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