Pazar, Kasım 22, 2009

C++ ile XML parse etme

Eğer ki bu blog'da bu yazıyı okuyorsanız iki ihtimal var ya bloğumu sürekli takip ediyorsunuz -kendimizi kandırmaya gerek yok bu düşük bir ihtimal :)) yada c++ ile xml de bir şeyler yapma gereği duydunuz ve google sayesinde bu blog ile karşılaştınız. Ben ikinci ihtimal daha olası olduğunu düşündüğüm için XML nedir ne işe yarar gibisinden bilgi vermeyeceğim (ki zaten buda kolayıma geliyor:D) çünkü ne olduğunu biliyorsunuz demektir. Ama yinede XML nedir diye merak ederseniz yeni eğitim sisteminin de temel dayanağı olan araştırmacı, öğrenmeyi bilen öğrenen (öğrenci değil!!!) yetiştirme politikasına hizmet açısından sizi bu adrese yönlendireceğim.

Evet sosyal mesajımızı da verdikten sonra bu laf kalabalığına son verip mevzuya giriş yapalım.

C++ da XML dosyalarını parse etmek için herşeyi bizim yapmamıza gerek yok sağolsun elin adamı bizler için vakti zamanında bir kütüphane yazmış. Bize düşen sadece kütüphanenin fonksiyonlarını doğru bir şekilde kullanmak. Bu kütüphanemizin adı libxml2. Öncelikle bağımlılıkları ile beraber bunu bilgisayarımıza kurup IDE ayarlarımızı yapacağız.

1- Bu adresten libxml2 nin Igor Zlatkovic adlı kişi tarafından windows için derlenmiş en son sürümünü indirelim(Kendisine de teşekkür ederiz). İndirdiğimiz dosyayı ileride bu yolu tekrar kullanacağımızı da göz önünde bulundurarak bir yere unzip edelim. (Ben C:\libxml2 yoluna unzip ettim anlatıma da buna göre devam edeceğim).

2- 1.adımda verdiğim linkten yine windows için derlenmiş iconv kütüphanesinin en son sürümünü indirelim -bu kütüphanenin ne işe yaradığını bende daha önceden bilmiyordum. İnternette kısa bir araştırmadan sonra karakter dönüştürme kütüphanesi olduğunu öğrendim. İleride işimize yarayabilecek bir bilgi ;). Aynı şekilde dosyaları yine bir yere unzip edin. (Ben C:\libiconv yoluna unzip ettim).

3- Şimdi sıra IDE ayarlarını yapmaya geldi. Ben her zamanki gibi Code::Blocks üzerinden anlatacağım. Diğer IDE'ler ile de yaklaşık olarak aynı mantıkla yapılan bir işlem. Codeblocksu açıp Settings menüsünden Compiler and debugger bölümüne giriyoruz. Ve aşağıda belirttiğim yerlere gerekli eklemeleri yapıyoruz.

Linker Settings->Link libraries: C:\libxml2\lib\libxml2.lib
Linker Settings->Link libraries: C:\libiconv\lib\iconv.lib

Search Directories->Compiler: C:\libxml2\include
Search Directories->Compiler: C:\libiconv\include
Search Directories->Linker: C:\libxml2\lib
Search Directories->Linker: C:\libiconv\lib
Search Directories->Resource compiler: C:\libxml2\include
Search Directories->Resource compiler: C:\libiconv\include

4- Kodu yazacağımız .cpp dosyasının yanında bazı dll'lerin bulunması gerekli. Bunları aşağıda belirttim. Biri hariç diğerlerini daha önce indirdiğimiz dosyalarda bulabilirsiniz.
  • libxml2.dll
  • iconv.dll
  • zlib1.dll (Burdan indirebilirsiniz. Tam olarak ne yaptığını bilmemekle beraber sıkıştırma işlemi için gerekli bir dll imiş.)
Kurulum bitti. Şimdi ufak bir program yardımı ile doğru bir şekilde işlemleri yapıp yapmadığımız kontrol edelim. Ben buradaki e-book tan yararlanarak aşağıdaki ufak programı yazdım.

"dosya.xml"
<?xml version="1.0" encoding="utf-8" ?>
<ogrenci>
<bilgi>
<ad>Esat ARSLAN</ad>
<dtarih>27/10/1986</dtarih>
</bilgi>
<bilgi>
<ad>Ali Veli</ad>
<dtarih>01/01/1986</dtarih>
</bilgi>
</ogrenci>



"xmlParse.cpp"
#include <iostream>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>

void xmlParse()
{
xmlDocPtr docPtr;
xmlNodePtr rootNodePtr;
xmlNodePtr childNodePtr;


docPtr = xmlParseFile("dosya.xml");
rootNodePtr = xmlDocGetRootElement(docPtr);
rootNodePtr = rootNodePtr->xmlChildrenNode;

while(rootNodePtr != NULL)
{
if ((!xmlStrcmp(rootNodePtr->name,(const xmlChar *) "bilgi")))
{
childNodePtr = rootNodePtr;
childNodePtr = rootNodePtr->xmlChildrenNode;
xmlChar *ad;
while(childNodePtr != NULL)
{

if ((!xmlStrcmp(childNodePtr->name,(const xmlChar *)"ad")))
{
ad = xmlNodeListGetString(docPtr,childNodePtr->xmlChildrenNode,1);
std::cout<<ad<<std::endl;
}
childNodePtr=childNodePtr->next;
}
}

rootNodePtr=rootNodePtr->next;
}

}

int main()
{
xmlParse();
return 0;
}

9 yorum:

Volkan SALMA dedi ki...

Teşekkürler ilk lazım olduğunda deniyeceğim :). Birde blogumda syntax highlighter kullanıyorum ama kod yayınlarken < > gibi karakterlerde hatalar oluşuyor. Sizin sitenizdeki sistem çok hoşuma gitti. Acaba nereden edinebilirim?

Esat ARSLAN dedi ki...

Aynı problemile bende karşılaştım. Çözüm ararken aşağıdaki linkte şimdiki kullandığım yöntemi keşfettim. Tek sorun c# formatında renklendirme yapması. Umarım işinize yarar :)

http://mehmettaskopru.blogspot.com/2009/02/blogger-uzerinde-kod-renklendirme.html

Anonim dedi ki...

Yaklaşık 6 saattir kullanımı kolay bir XMLParser arıyordum C++ için. Çoğu library sıkıntı çıkardı. Sizin yazdığınız post sayesinde ise dosyayı okuyabildim.

Teşekkürler.

Esat ARSLAN dedi ki...

Yardımcı olmasına sevindim

Kolay gelsin..

fehoo dedi ki...

Dev c++ için de kullanılabiliyor mu bu parser?

Esat ARSLAN dedi ki...

Denemedim, muhtemelen çalışıyodur.

fehoo dedi ki...
Bu yorum yazar tarafından kaldırıldı.
fehoo dedi ki...

Kardeş bu dll leri nereye atacağız? gzdirect yordam giriş noktası, zlib.dll dinamik bağlantı kitaplığında bulunamadı." hatası alıyorum.

Esat ARSLAN dedi ki...

dll dosyları, programın oluştuğu exe nin yanında olmalı. Ama tabi bundan önce, kütüphane dosyalarını doğru şekilde IDE ayalarından projeye bağlamalısın.