9 Kasım 2016 Çarşamba

C++ XML işlemleri


XML, farklı sistemler/yazılımlar arasında veri paylaşımını sağlamak için geliştirilmiş bir standarttır. Böylece paylaşılmak istenen verilerin, standart format kullanılarak yazılımdan bağımsız bir şekilde saklanması ve iletilmesi sağlanır.

C++ ile XML dökümanları oluşturmak ve okuyup ayrıştırmak için çeşitli kütüphaneler mevcuttur. Bunlardan bazıları :






libxml2 ( http://xmlsoft.org )





Gördüğünüz gibi C++ ile XML işlemlerini gerçekleştirmek için seçenek bayağı fazla. Hangi kütüphane kullanım amacımıza daha uygun diye karşılaştırma yapabilmek için aşağıdaki akış diyagramına göz atalım.



Buna göre; Eğer XML'den veriyi hızlı bir şekilde çekip kullanmak istiyorsak rapidxml, veri boyutları çok büyük yani GB'lar seviyesinde ise libxml2 kullanmanın avantajlı olduğu ilk gözümüze çarpanlar. Daha ayrıntılı bilgi referans olarak verdiğim linkte mevcut.

Bu yazı kapsamında RapidXml ile XML parsing ve XML'e veri kaydetme ile ilgili örnek kodlar paylaşacağım.

XML de veri en üstte bir kök ve onun dallandığı yapraklar şeklinde ağaç yapısı şeklinde saklanır.
XML'de saklanan veri hiyerarşik ağaç yapısındaki bir element in içeriğinde ya da çeşitli özelliklerinde (attribute) saklanabilir. 
<element-name attribute1 attribute2>
....content
</element-name>
Örneğin aşağıdaki gibi bir düğümde yas kişiye dair attribute
<kisi yas="27">

Burada ise yas kisiye dair bir element 'dir.
<kisi>
  <yas>27</yas>
</kisi>

Şimdi RapidXml kütüphanesi ile bir kök düğüm ve onun çocuklarına(child) dair attribute değerlerini okuyup değişkene nasıl aktaracağımıza bakalım.

İlk başta RapidXml kütüphanelerini projemize ekliyoruz (proje ile aynı konumda rapidxml-1.13 klasörü içerisinde

#include "rapidxml-1.13/rapidxml_iterators.hpp""

#include "rapidxml-1.13/rapidxml_print.hpp"
#include "rapidxml-1.13/rapidxml.hpp""
#include "rapidxml-1.13/rapidxml_utils.hpp"


Kütüphaneleri projeye ekledikten sonra, XMLdocument.xml isimli dosyayı açıyoruz. Eğer dosya mevcut ve okundu ise ilk olarak root isimli kök düğümü root_node isimli değişkene aktarıyoruz. root kök düğümünün altında child isimli bir alt düğüm olduğunu ve bu child düğümünün name ve value adında iki tane attribute içerdiğini farzedersek; kök düğüm altındaki her bir child düğümünün ilgili attribute değerlerini okuyan C++ kodu aşağıdaki gibidir.




Hakeza C++ içerisindeki verileri Xml dosyaya kaydetmek istediğimizde; yine ana bir kök düğüm ve kök düğümün altında param isminde bir alt düğüm(child) olmak üzere, kök ve köke ait iki alt düğümü xml dosyaya yazan C++ kodu ise aşağıdaki gibidir.


Hiç yorum yok:

Yorum Gönder