23 Nisan 2008 Çarşamba

Python ile QtXml sınıfını kullanmak


Bugün beni saatlerce uğraştıran küçük bir keşif bu. Keşif diyorum çünkü Qt'yi sadece Qt Designer'den kullanmış birisi olarak Qt referans belgeleri arasında kayboldum. Bulabildiğim tüm örnekler C üzerindeydi ve Qt ile xml parse işlemi yapan pek kimsenin olmadığını fark ettim. Herhalde başka kütüphaneler kullanıyorlar ama ben Qt diye tutturdum :) Hele PyQt ile xml parsing örneği bulabilen varsa allah rızası için bana adresini yazsın...

Aslında gerek kalmadı işin mantığını çözdüm, ama hala bana Python ve Qt ayrı dünyalarda gibi geliyor. Madem kimse yazmamış işte ben yazıyorum, Python'da Qt kütüphanesi ile nasıl XML Parse edilir.


XML Dosyası şöyle olsun;


<PISI>
<Distribution>

</Distribution>
<Package>

</Package>
<Package>

</Package>
</PISI>



Minik python kodu da şu;

#!/usr/bin/python


from PyQt4 import QtCore, QtXml

#Dosya'yı aç ve oku
f = QtCore.QFile("pisi-index.xml")
f.open(QtCore.QIODevice.ReadOnly)
heap = f.readAll()

#Xml nesnesi oluştur
xml = QtXml.QDomDocument()

#Xml içeriğini nesneye aktar.
#aktarınca parse edilmiş olacak
#geri dönüş değeri 4 adet değişken oluyor
#ve () içinde bu dönen değerler alınabiliyor
#ilk değişken parse işleminin başarı durumu
(success, msg, a,b) = xml.setContent(heap)
print success

#firstChild fonksiyonu adı üstünde
#ilk Xml düğümünü (node) yani root-node'u
#QDomNode nesnesi olarak döndürüyor
first = xml.firstChild()

#QDomNode nesnesinin nodeName fonksiyonu
#düğümün adını döndürüyor
print first.nodeName()

#ChildNodes ise bağlı düğümlerin bir
#listesini tutan QDomNodeList
#nesnesinin döndürüyor
childs = first.childNodes()

#Bu nesnenin at() fonksiyonuna verilen
#parametre kaçıncı düğümü döndüreceğini
#belirtiyor tabii ki dönen nesne de bir QDomNode
firstelement = childs.at(1)
print firstelement.nodeName()

Programı çalıştırınca çıktımız şöyle;

True
PISI
Package

Bu çıktıdan nelerle uğraştığımı da anlamış olabilirsiniz :) Ayrıca Qt ile ilgileniyorsanız ve Pardusunuzda Qt Asistan kuruluysa kendinize bir sürpriz yapın ve "qtdemo" komutunu çalıştırın.

2 yorum:

  1. Xml'de tagların içinde başka tag'lar var aslında ama ben uzatmamak için öyle boş yazıverdim, yani bu örnek xml ile kod çalışmıyor diye kendinizi yormayın. :)

    YanıtlaSil
  2. Elinize sağlık, güzel bir yazı olmuş. "qtdemo"yu da bilmiyordum sürpriz oldu :)

    YanıtlaSil