19 Mayıs 2016 Perşembe

boost property_tree

Giriş
Bu sınıf XML, JSON, INI, INFO dosyalarını okuyabilir. Daha rahat kullanmak için şu satırı kullanırız.
using boost::property_tree::ptree;
Sınıf key-value çiftleri içerir. Value alanı her zaman metin değerler saklar.
The concept of a Property Tree provides hierarchical storage of data (key-value pairs) where the value is text.
empty_tree
Bu metod şöyle tanımlı.
template<class Ptree>
inline const Ptree &empty_ptree()
{
  static Ptree pt;
  return pt;
}
Info İçin
Şu satırı dahil ederiz.
#include <boost/property_tree/info_parser.hpp>
read_info metodu
Şöyle yaparız.
ptree pt;
std::istringstream iss(R"(propset1
        {
            prop1 2
            prop2 5
            prop3 60
            prop4 7
        })");
read_info(iss, pt);
write_info metodu
Şöyle yaparız.
write_info(std::cout, pt);
XML İçin
Kullanmak için şu satırı dahil ederiz.
#include <boost/property_tree/xml_parser.hpp>
read_xml metodu
Şöyle yaparız.
boost::property_tree::ptree pt;
boost::property_tree::read_xml("./test1.xml", pt);
Şöyle yaparız.
read_xml(stream, pt, trim_whitespace | no_comments);
Bu metod exception atar. Şöyle yaparız.
try {
  stringstream ss;
  ...
  read_xml(ss, xmlTree);
  ...
}
catch (xml_parser_error &e) {
  cout << "Failed to read xml " << e.what() << endl;
}
write_xml metodu
Şöyle yaparız.
write_xml(std::cout, pt,
 boost::property_tree::xml_writer_make_settings<std::string>(' ', 4, "utf-8"));
JSON İçin
Şu nota dikkat etmek gerekir
JSON values are mapped to nodes containing the value. However, all type information is lost; numbers, as well as the literals "null", "true" and "false" are simply mapped to their string form.
ptree sınıfı
add metodu
Düğüme özellik ekler. Şöyle yaparız.
ptree childset2;
childset2.add("child2prop1", 2);
add_child metodu
Düğüme alt düğüm ekler. Şöyle yaparız.
propset1.add_child("childset2", childset2);
get_child metodu - no default value
Bu metod exception atabilir.
try {
    auto node = xmlTree.get_child( "example" ));
}
catch (ptree_bad_path) {
  ...
}
Bir düğüme erişmemizi sağlar. Döndürdüğü nesne
boost::property_tree::ptree::value_type
türündendir. XML için Bu type bir pair gibidir. first alanı tag ismini, second alanı ise alt düğümleri belirtir. Şöyle yaparız.
auto po = pt.get_child("purchaseOrder");
Şöyle yaparız.
auto& propset1 = pt.get_child("propset1");
get_child metodu - with default value
Eğer aradığımız düğüm yoksa boş bir sonuç gelsin istersek şöyle yaparız.
const ptree & formats = xmlTree.get_child("article", empty_ptree());
Daha sonra döngü içinde dönebiliriz. Böylece purchaseOrder düğümü altındaki ilk seviye tüm alt düğümleri dolaşabiliriz.
BOOST_FOREACH(boost::property_tree::ptree::value_type & node, pt.get_child(...))
{
  std::string tagname = node.first;
  boost::property_tree::ptree subtree = node.second;
    
}
Attribute değerlerine şöyle erişiriz.
const ptree & formats = xmlTree.get_child("article", empty_ptree());
BOOST_FOREACH(const ptree::value_type & f, formats)
{

  const ptree & attributes = f.second.get_child("<xmlattr>", empty_ptree());
  //Extracting attributes
  BOOST_FOREACH(const ptree::value_type &v, attributes)
  {
    string first = v.first.data();
    //Attribute ismi
    if (first == "title")
    {
      v.second.data();//Attribute değeri    }
  }
}
get metodu
Düğümün özelliğine erişmemizi sağlar. Şöyle yaparız.
po.get("items.item.Price.USPrice", "");
put metodu
Düğüme bir özellik atar. Şöyle yaparız.
ptree temp1;
temp1.put("element.<xmlattr>.name","elem1");
temp1.put_child("element.temp", {});

ptree temp2;
temp2.put("element.<xmlattr>.name","elem2");
temp2.put("element.temp", "");

//Add temp1 and temp2 to <main> under <elements>
ptree pt;
pt.add_child("main.elements.element", temp1.get_child("element"));
pt.add_child("main.elements.element", temp2.get_child("element"));
Çıktı olarak şu xml'i alırız.
<?xml version="1.0" encoding="utf-8"?>
<main>
    <elements>
        <element name="elem1">
            <temp/>
        </element>
        <element name="elem2">
            <temp/>
        </element>
    </elements>
</main>






Hiç yorum yok:

Yorum Gönder