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ı :
RapidXml
(http://rapidxml.sourceforge.net)
TinyXml (
http://www.grinninglizard.com/tinyxml/)
Xerces (
http://xerces.apache.org/xerces-c/
)
libxml2 (
http://xmlsoft.org )
Boost.PropertyTree (
http://www.boost.org/doc/libs/1_61_0/doc/html/property_tree.html
)
pugixml (
https://github.com/zeux/pugixml
)
irrXml (
http://www.ambiera.com/irrxml/
)
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"
İ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