Xml.Dom.Minidom

Pardus-Linux.org | Wiki sitesinden

Git ve: kullan, ara

Python ile Basit XML İşlemleri


Bir XML dosyasını Python ile çözümlemek ve XML dosyasıyla işlemler yapabilmek için xml.dom, xml.sax, xml.parsers gibi modüller kullanılabilir. Biz bu iş için xml.dom modülünün biraz daha hafifletilmişi olan ve xml.dom fonksiyonlarının birçoğunu kullanabileceğimiz xml.dom.minidom modülünü inceleyeceğiz.

xml.dom.minidom modülü parse() ve parseString() adlarında işimize çok yarayacak iki fonksiyon sağlar. Hemen kullanıma geçecek olursak :

01- from xml.dom.minidom import parse, parseString                           
02- ornek1 = parse("Pardus-Linux.org.xml")                                           
03- ornek2 = parseString("<PARDUS><PKD>www.pardus-Linux.org</PKD><PKD>forum.pardus-Linux.org</PKD><PKD>wiki.pardus-Linux.org</PKD></PARDUS>")  

Betiği inceleyelim :

1. satırda gerekli modül ve fonksiyonları çağırdık
2. satırda Pardus-Linux.org.xml dosyasını çözümledik
3. satırda ise XML biçiminde yazılmış bir metni çözümledik.

Yukarıdaki betikten de alayacağınız gibi, parse() fonksiyonu bir XML dosyasını çözümlerken, parseString() fonksiyonu XML tipinde yazılmış bir değişkeni ya da metni çözümlemektedir. Eğer bu aşamada ornek1 değişkeninin ne içerdiğini merak ediyorsanız, <xml.dom.minidom.Document instance at 0xa90a8ac> gibi bir veri içeriyor. Eğer ornek1 değişkenini XML biçiminde yazdırmak istersek, toxml() fonksiyonunu kullanırız.

01- ornek1 = parse("Pardus-Linux.org.xml")
02- print ornek1
03- print ornek1.toxml()

2. satırın çıktısı

<xml.dom.minidom.Document instance at 0xa90a8ac>

3. satırın çıktısı

<?xml version="1.0" ?><PARDUS>
        <PKD>www.pardus-linux.org</PKD>
        <PKD>forum.pardus-linux.org</PKD>
        <PKD>wiki.pardus-linux.org</PKD>
</PARDUS>

Diyelim ki bize sadece PKD bölümünün içinde yazanlar lazım. Sadece bu verileri çekmek için, işimize çok yarayacak bir fonksiyon bulunmakta :getElementsByTagName('PKD'). Bu fonksiyon bize bir XML metninde PKD bölümünde bulunan tüm yazıları verecektir.

Kullanımına gelecek olursak :

01- for bolum in ornek1.getElementsByTagName('PKD'):
02-      print bolum.toxml()

betiğine benzer bir betik kullanırız. bolum değişkenin bağlı olduğu bölüm için bolum.nodeName, içeriği için bolum.nodeValue ve sahip olduğu herhangi bir alt bölüm için bolum.childNodes fonksiyonları kullanılır.


Buraya kadar gördüklerimiz bir XML dosyasının basit olarak nasıl okunabileceğiyle ilgiliydi. Şimdi de bir XML dosyasına nasıl veri eklenir konusuna değinelim.

Bir XML bölümü eklemek için kullanacağımız fonksiyon createElement() iken, eklediğimiz bölümün içine metin yazmak için kullanacağımız fonksiyon createTextNode() ve bölümü içindeki yazıyla birlikte XML yazısına ekleyeceğimiz fonksiyon appendChild() fonksiyonudur. Hemen örneklemeye geçecek olursak :

1- from xml.dom.minidom import parse                                                        
2- ornek = parse("Pardus-Linux.org.xml")                                                           
3- bolum = ornek.createElement("TUBITAK")                                                   
4- ekle = ornek.createTextNode("www.pardus.org.tr")                                      
5- bolum.appendChild(ekle)                                                                              
6- ornek.childNodes[0].appendChild(bolum)                                                                 

Satırları açıklayacak olursak :

1. satırda gerekli olan modülü ve fonksiyonu çağırdık
2. satırda XML dosyamızı çözümledik
3. satırda <TUBITAK> bölümünü oluşturduk
4. satırda "www.pardus.org.tr" verisini oluşturduk
5. satırda <TUBITAK>www.pardus.org.tr</TUBITAK> satırını oluşturduk
6. satırda <PARDUS> anabölümünün en altında yeni bölümümüzü ekledik.

Ve XML dosyası işleme konusunu basit bir biçimde öğrenmiş olduk. Şimdi xml.dom modülünden işimize yarayacak bazı nesneleri tanıyalım :

parentNode :     Bir üst bölümün ne olduğunu verir.
childNodes  :     Alt dizinleri listeler.
firstChild :          İlk bölümü verir.
lastChild :          Son bölümü verir.
removeChild :   Bölümü siler.
nodeName :     Bölüm adını verir

Bunların kullanımına kısa bir örnek verecek olursak :

01- from xml.dom.minidom import parseString
02- xmlverisi = """
03-     <TUBITAK>
04-         <AnaSayfa>www.tubitak.gov.tr</AnaSayfa>
05-         <PARDUS>
06-             <AnaSayfa>www.pardus.org.tr</AnaSayfa>
07-             <PKD>
08-                     <PLO>
09-                         <AnaSayfa>www.pardus-linux.org</AnaSayfa>
10-                         <Forum>forum.pardus-linux.org</Forum>
11-                         <Wiki>wiki.pardus-linux.org</Wiki>
12-                         <Gezegen>gezegen.pardus-linux.org</Gezegen>
13-                         <Sohbet>sohbet.pardus-linux.org</Sohbet>
14-                         <EDergi>www.pardus-edergi.org</EDergi>
15-                     </PLO>
16-                     <AnaSayfa>www.pkd.org.tr</AnaSayfa>
17-             </PKD>
18-         </PARDUS>
19-     </TUBITAK>"""
20-
21- xml = parseString(xmlverisi)
22-
23- print xml.firstChild.nodeName -
24- print xml.lastChild.nodeName 
25- print xml.childNodes[0].nodeName 
26- print xml.childNodes[0].childNodes[1].nodeName 
27- print xml.childNodes[0].childNodes[3].nodeName 
28- print xml.childNodes[0].childNodes[3].childNodes[3].nodeName 
29- print xml.childNodes[0].childNodes[3].childNodes[3].parentNode.nodeName 

Bu betikte sadece 23-29. satırların çıktılarını verelim :

23. satır -> TUBITAK
24. satır -> TUBITAK
25. satır -> TUBITAK
26. satır -> AnaSayfa
27. satır -> PARDUS
28. satır -> PKD
29. satır -> PARDUS


Erdem Artan -  baDibere@gmail.com

Bu yazı Pardus-Linux.org eDergi 4. Sayı'dan Derlenmiştir.