Groovy – Xml Okuma

Önceki yazımda bahsettiğim gibi Groovy incelemeye başladım. Örnekten örneğe dolaşırken, Xml ayrıştırması ilgili örneğe denk geldim. Bir Xml ayrıştırma işlemi ancak bu kadar kolaylaştırılabilir. Özellikle böyle basit ve alıştırma denilecek safhalarda böyle örnekler görmek beni bu dili öğrenmeye daha da itiyor. Bu sebepten bende benzer bir örneği sizin için hazırladım.

HazırlıkGroovy

Örneğe başlamadan önce sisteminizde Groovy kurulu olduğundan ve Eclipse’inize Groovy eklentinizi eklediğinizden emin olun. Eğer daha bu işlemleri yapmadıysanız önceki Groovy yazımdan bu işlemleri gerçekleştirebilirsiniz. Eğer Eclipse ile duygusal bir bağınız yoksa en azından Groovy geliştirirken kullanmak için Intellij Idea’yı denemenizi öneririm.

Sisteminizi hazırladığınıza göre artık Xml Okuma kısmına geçebiliriz.

Xml Okuma

Xml ayrıştırma kısmına başlamadan önce ayrıştıracağımız XML dosyasını oluşturalım. Gelin bir Xml dosyası içerisinde kullanıcı bilgilerinin tutulduğunu ve bizim bu kullanıcı bilgilerini okumak istediğimizi varsayalım.

Groovy Projesinin Hazırlanması

Öncelikle Yeni Groovy Projemizi oluşturalım. Bunun için CTRL+N yapıp Groovy Project‘i seçiyoruz. Ardından projemizin adını verip Finish diyoruz. Ben bu projeme XMLReader (Evet, çok orjinal) diyorum. Beklediğiniz gibi yeni projeniz başarıyla oluşuyor.

Şimdi genel olarak Xml dosyalarımızda ayarlarımızı tuttuğumuzu göz önüne alacak olursak, bu xml dosyasının ayrı bir klasörde olması, örneğin gerçekliği açısından önemli olacaktır. Bunun için yeni oluşturduğumuz XMLReader projesine sağ tıklayıp New->Folder diyoruz. Yeni oluşturduğum klasörün adını conf koyuyorum. Daha sonra yeni oluşturduğum klasöre sağ tıklayıp New->File seçeneğini seçiyorum. Dosyamın adınıda içeriğine uygun olacak şekilde users.xml koyuyorum. Son durumda projenin yapısı aşağıdaki gibi oluyor.

Projenin Son Hali

Xml Dosyası

Şimdi users.xml dosyasını oluşturmaya geçebiliriz. Xml dosyası içeriğiyle çok uğraşmamak için basit bir Xml dosyası düşünüyorum. Örneğin sadece kullanıcı adı ve parola bilgisi bulunsun bu Xml dosyasında. Tamam biraz gerçeklikten çıkıyoruz ama biraz basitlik için gerçeklikten çıkmanın sakıncası yok bence.

users.xml


<users>
<user>
<userName>bhdrkn</userName>
<password>1q2w3e</password>
</user>

<user>
<userName>bahadir.akin</userName>
<password>123456</password>
</user>

<user>
<userName>bahadir</userName>
<password>pass</password>
</user>
</users>

Script

Okuyacağımız Xml dosyamız ve Groovy projemiz hazır olduğuna göre artık Script’imizi yazabiliriz. Bunun için yeni bir Groovy Class’ı oluşturuyoruz.

  • Paket adı olarak, com.bahadirakin.xml
  • Class adı olarak, XmlReadScript (Evet, yine çok orjinal)
  • Create Script kutucuğunu işaretliyoruz

Scriptimizi oluşturduğumuza göre artık içeriğini doldurabiliriz.

XmlReadScript.groovy


package com.bahadirakin.xml

def file = new File("conf/users.xml")
def users = new XmlParser().parse(file)

def userList = users.user
println "User Count: " + userList.size()
println "First User's userName: " + users.user[0].userName.text()

userList.each() { user -> println "UserName: " + user.userName.text() + " Password: " + user.password.text()}

Evet, süper değil mi? Tek bir script içerisinde toplasanız üç dört satırı geçmeden işimizi hallettik.

Açıklamalar

Büyük ihtimalle script dilinde ustalaşmış kişiler için yapılan bu işlem büyük bir şey değil. Ama benim için, yani çoğunlukla java geliştiren ve geliştirdiği herşey için ek bir ton fazladan kod yazan biri için, büyüleyici güzellikte. Dilin Dynamicly Typed olmasının getirdiği bir özellik tabikide bu. Şimdi ufak ufak açıklamaya başlayalım.

  • Dosya okuma kısmında açıklayacak çok fazla bişey yok. Zaten Java’daki File sınıfı olduğu gibi kullanıyoruz. XmlParser sınıfınında anlatılacak çok bir tarafı yok. Tek yaptığı dosyayı alıp Node nesnesine dönüştürmek.
  • Bu arada belirtilmemiş ama users nesnesi Node türünde. Ama bunu alışık olduğunuz Node olarak düşünmeyin. Burdan sonra çağırdığınız her özellik, örneğin user, tüm xml’i tarayarak size user elementini getiriyor.
  • User elementleri birden fazla olabileceğinden size alarak kontrol ediyoruz. Ama yüzde yüz bir tane olduğunu bildiğiniz yerde bunu yapmanıza gerek yok. Yani siz ona liste gibi davranırsanız liste davranmazsanız tekil nesne olarak yorumlanacak. Java kullanıcıları için biraz dumanlar çıkaracak bir özellik.
  • Bizim user elementleri birden fazla olduğundan biz ona çoğul davranıyoruz. Gidip kullanıcı adını alıyoruz.
  • Daha sonrasında yapılan işlem ise Closure. Buda java kullanıcıları için yeni bir özellik.

Closure

Closure’ı kod bloğu ya da method pointer’ı gibi düşünebilirsiniz. Tabi method’u anında tanımlıyor olmamıza da dikkatinizi çekmek isitoyorum. Closure’ın method’tan farkı her closure bulunduğu blok içinde tanımlıdır. Gidip başka bir yerden Static gibi erişemezsiniz.

Bizim örneğimizde ise liste üzerinde foreach ile gezip tek tek elemanların içeriğini ekrana yazdırmak yerine bunu Closure ile yapıyoruz. Liste ya da dizilerin each metodu içerisine closure alıyor. Closure tanımını yaparken parametresinin ne olacağını söylüyoruz.

Closure ile ilgili ayrıntılı bilgi için bu sayfadan yararlanabilirsiniz.

Son

Son durumda XML okumanın nasıl kolay olduğunu gördük. Tek yapmamız gereken erişmek istediğimiz Node adını sanki gerçek bir özellik gibi belirtmek oldu. Yalnız tamam groovy iyi hoş, güzel. Fakat büyük projelerde bu şekilde sadece Script dosyaları üzerinden ilerlemeyeceğiz. Sınıflar yazılacak, belirli bir akış tanımlanacak. Böyle bir durumda dilin kendi yazım şeklinin bilinmesi ve ona göre geliştirme yapılması yerinde olacaktır. Bu sebepten bir sonraki yazıda, Groovy dilin standartlarını Java geliştirici perspektifinden incelemeye çalışacağım.

End Of Line