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(); }