• boost-使用property_tree来解析xml、json


    property_tree是一个保存了多个属性值的树形数据结构,可以用来解析xml、json、ini、info文件。要使用property_tree和xml解析组件的话需要包含"boost/property_tree/ptree.hpp"和"boost/property_tree/xml_parser.hpp"。我们一般使用property_tree中预定义好的typedef: ptree来处理数据。

    1、XML

    如以下为读取xml文件中内容的示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <conf>
        <gui>0</gui>
        <theme>matrix</theme>
        <urls>
            <url>http:://www.url1.com</url>
            <url>http:://www.url2.com</url>
            <url>http:://www.url3.com</url>
            <url></url>
        </urls>
        <clock_style>24.35</clock_style>
    </conf>
    #include <cstdio>
    #include <string>
    #include <iostream>
    using std::string;
    #include "boost/property_tree/ptree.hpp"
    #include "boost/property_tree/xml_parser.hpp"
    #include "boost/typeof/typeof.hpp"
    #include "boost/optional.hpp"
    using namespace boost::property_tree;
    
    int main()
    {
        ptree pt;
        read_xml("conf.xml", pt);
    
        boost::optional<int> op = pt.get_optional<int>("conf.gui");//使用get_optional()获得节点,不存在则op为空
        if (op)
        {
            int i = op.get();
        }
    
        string str1 = pt.get<string>("conf.theme", "");//使用get()获得节点,不存在则返回""
    
        boost::optional<ptree&> child_null_test = pt.get_child_optional("conf.urls");
        if (child_null_test)
        {
            BOOST_AUTO(child, pt.get_child("conf.urls"));
            for (BOOST_AUTO(pos, child.begin()); pos != child.end(); ++pos)
            {
                string str = pos->second.get_value<string>();
                std::cout << str << std::endl;
            }
        }
    
        string str = pt.get("conf.clock_style", "");
    }

    以下为向xml文件添加内容:

        ptree pt;
        read_xml("conf.xml", pt);
        pt.add("conf.urls.url", "http://www.url4.com");
        write_xml("conf.xml", pt);

    以下为修改xml中内容:

    ptree pt;
        read_xml("conf.xml", pt);
        pt.put("conf.gui", 99);
        write_xml("conf.xml", pt);

    以下为新建一个xml文件或打开一个xml并将里面的内容清除:

    ptree pt;
        pt.put("conf.gui", 0);
        write_xml("conf.xml", pt);

    节点的属性保存在节点的<xmlattr>中,节点的注释保存在节点的<xmlcomment>中,获取示例如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <conf><!--conf comment-->
        <gui>1</gui>
        <theme id="001">matrix</theme>
        <urls><!--urls comment-->
        </urls>
    </conf>
    ptree pt;
        read_xml("conf.xml", pt);
        boost::optional<string> op = pt.get_optional<string>("conf.<xmlcomment>");
        if (op)
        {
            string strCommentConf = op.get();
        }
        op = pt.get_optional<string>("conf.urls.<xmlcomment>");
        if (op)
        {
            string strCommentUrls = op.get();
        }
        op = pt.get_optional<string>("conf.theme.<xmlattr>.id");
        if (op)
        {
            string strAttr = op.get();
        }

     2、JSON

    使用property_tree解析json与解析xml的接口方法基本相同,不同的地方是读取json文件使用read_json,写入json文件使用write_json,如下示例:

    {
        "conf":
        {
            "gui": 1,
            "theme": "matrix",
            "urls":
            {
                "url": "http://www.url1.com",
                "url": "http://www.url2.com",
                "url": "http://www.url3.com"
            },
            "clock_style": 24
        }
    }
    #include <cstdio>
    #include <string>
    #include <iostream>
    using std::string;
    #include "boost/property_tree/ptree.hpp"
    #include "boost/property_tree/json_parser.hpp"
    #include "boost/typeof/typeof.hpp"
    #include "boost/optional.hpp"
    using namespace boost::property_tree;
    
    int main()
    {
        ptree pt;
        read_json("conf.json", pt);
    
        boost::optional<int> op = pt.get_optional<int>("conf.gui");//不存在则op为空
        if (op)
        {
            int i = op.get();
            int a = 0;
        }
    
        string str1 = pt.get<string>("conf.theme", "");
    
        boost::optional<ptree&> child_null_test = pt.get_child_optional("conf.urls");
        if (child_null_test)
        {
            BOOST_AUTO(child, pt.get_child("conf.urls"));
            for (BOOST_AUTO(pos, child.begin()); pos != child.end(); ++pos)
            {
                string str = pos->second.get_value<string>();
                std::cout << str << std::endl;
            }
        }
    
        string str = pt.get("conf.clock_style", "");
        
        return getchar();
    }
  • 相关阅读:
    五、异步任务编排CompletableFuture
    四、fork/join框架
    三、阻塞等待异步结果FutureTask
    二、synchronized同步锁
    一、Java多线程基础
    6. ZigZag Conversion (字符串的连接)
    5. Longest Palindromic Substring (DP)
    4. Median of Two Sorted Arrays (二分法;递归的结束条件)
    3. Longest Substring Without Repeating Characters (ASCII码128个,建立哈西表)
    2. Add Two Numbers
  • 原文地址:https://www.cnblogs.com/milanleon/p/7422858.html
Copyright © 2020-2023  润新知