【问题标题】:Boost::ptree parser can't read the container from the xml fileBoost::ptree 解析器无法从 xml 文件中读取容器
【发布时间】:2014-11-08 01:45:47
【问题描述】:

我需要对 XML 文件进行简单的输入输出。我正在使用 boost::ptree。

struct structure
{
    std::string str;
    int ival;
    std::list<bool> bval;

    void save(const std::string& filename) {
        ptree pt;
        pt.put("main.str", str);
        pt.put("main.ival", ival);

        for (const auto& x : bval)
            pt.put("main.bval.b", x); 

        write_xml(filename, pt);
    }

    void load(const std::string& filename) {
        ptree pt;

        read_xml(filename, pt);

        str = pt.get("main.str", str);
        ival = pt.get("main.ival", ival);

        for(auto& v : pt.get_child("main.bval"))
             bval.insert(v.second.data());
    }
};

int main()
{
    structure b, s;
    s.str = "abc";
    s.ival = 14;
    s.bval = { 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 };

    try
    {
        s.save("zxx.xml");

        b.load("zxx.xml");
    }
    catch (std::exception& exc)
    {
        std::cout << exc.what() << std::endl;
    }
    return 0;
}

输入无法正常工作,因为文件中只有一个“bval”元素写入。另外,我不知道如何制作这个容器的输出(bval)。请帮忙!

【问题讨论】:

    标签: c++ xml boost ptree


    【解决方案1】:

    您只需将put 替换为add。 “Put”假定不应重新创建密钥。

    通过此修复,您可以进行往返:

        s.save("zxx.xml");
        b.load("zxx.xml");
        b.save("zxx2.xml");
    

    现在,您可以测试 zxx.xml 是否等于 zxx2.xml。

    查看 Live On Coliru 打印:

    g++ -std=c++11 -Os -Wall -pedantic main.cpp && ./a.out && md5sum *.xml
    8a91a9b67d3ac4518e59d23c90edabb0  zxx.xml
    8a91a9b67d3ac4518e59d23c90edabb0  zxx2.xml
    

    上市

    #include <boost/property_tree/ptree.hpp>
    #include <boost/property_tree/xml_parser.hpp>
    #include <list>
    #include <iostream>
    
    using boost::property_tree::ptree;
    
    struct structure
    {
        std::string str;
        int ival;
        std::list<bool> bval;
    
        void save(const std::string& filename) {
            ptree pt;
            pt.put("main.str", str);
            pt.put("main.ival", ival);
    
            for (const auto& x : bval)
                pt.add("main.bval.b", x); 
    
            write_xml(filename, pt);
        }
    
        void load(const std::string& filename) {
            ptree pt;
    
            read_xml(filename, pt);
    
            str = pt.get("main.str", str);
            ival = pt.get("main.ival", ival);
    
            for(auto& v : pt.get_child("main.bval"))
            {
                 bval.push_back(v.second.get<bool>(""));
            }
        }
    };
    
    int main()
    {
        structure b, s;
        s.str = "abc";
        s.ival = 14;
        s.bval = { 1, 0, 0, 1, 0, 1, 0, 0, 0, 1 };
    
        try
        {
            s.save("zxx.xml");
    
            b.load("zxx.xml");
    
            b.save("zxx2.xml");
        }
        catch (std::exception& exc)
        {
            std::cout << exc.what() << std::endl;
        }
        return 0;
    }
    

    【讨论】:

    • 非常感谢!但它是什么? bval.insert(bval.end(), "true" == v.second.data()); 还有一个问题:data() 函数有什么作用?
    • 哦,那部分与你的问题无关,我只是修复了它,所以它编译了。你的问题的答案与pt.add("main.bval.b", x);一致(也是我回答的第一句话)
    • 是的,我明白了。我只是想了解那条线是什么,它的作用是什么。
    • 这就是为什么 date() 返回字符串的原因?返回的对象是否需要额外的演员表? bval.insert(bval.end(), boost::lexical_cast&lt;int&gt;(v.second.data())); 有效。
    • 那么为什么函数 get() 可以在没有任何强制转换的情况下工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2011-11-15
    • 1970-01-01
    • 2012-03-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多