Java ME’de XML işlemek

____________________________________________________________________

XML biçiminde içerikler ne kadar yaygın olsa da Java ME destekleyen çoğu cihaz bunu desteklemiyor. XML işlenmesi cep telefonları gibi düşük işlem gücüne sahip aletlerde zaman alıcı olduğundan XML işleme desteği standart olarak eklenmedi. JSR 280 (XML API for Java ME – Java ME için XML API) olsa da ne yazık ki hala çoğu cihazın sanal makinesinde bulunmayan bir özellik. Bu durumda da geliştiriciler XML işleme işini kendileri yaptırmak zorundalar. Bunun için isteyen (benim de ilk başta yaptığım gibi) kendi XML işleme kütüphanesini yazmaya kalkabilir( 😀 ), isteyen de KXML adındaki pek iyi XML işleme kütüphanesini kullanabilir.

KXML kütüphanesi ile uygulamanıza XML işleme özelliği ekleyebiliyorsunuz. Böylece sizi kendi XML kütüphanesini işleme derdinden kurtarıyor. Sanırım kod son olarak 2005 yılında düzenlenmiş ancak JSR 280 (tahminim) daha sonra çıktığı için bu kodu uygulamanızda kullanmak cihaz JSR 280 desteklese bile daha iyidir, çünkü çoğu cihazda JSR 280 desteği yoktur. Ya da hiç değilse JSR 280 yok ise bu kodu kullanması için bir kod yazın ki uygulamanız tüm cihazlarla uyumlu olsun. JSR 280 muhtemelen daha hızlı işlem yapacaktır, bu konuda pek yapacağımız yok.

KXML2 sürümünü buradan indirebilirsiniz, 3 için planlar var ama 4 yıldır gelmediğine göre gelmeyecek anlaşılan. 🙂

KXML kullanabilmek için KXML kütüphanesini IDE programınıza tanıtmanız gerekli ki derleme esnasında bu kütüphaneyi de uygulamanıza eklesin. Bunun için NetBeans‘ta projenizin üzerine sağ tıklayıp Properties > Build > Libraries & Resources yolundan gidin. Burada Add JAR/ZIP… butonuna tıklayıp indirdiğiniz JAR dosyasını bulup seçin. Bundan sonra Open dediğinizde kütüphane uygulamanıza eklenmiş olacaktır. NetBeans kütüphaneyi tarayıp kullanım esnasında işe yarayacak metodları vs. göstermek için indeksleyecektir.

kxml2 NetBeans'a ekli.

KXML2 NetBeans'a ekli.

Bundan sonra iş uygulamanızda bu kütüphaneyi çağırıp kullanmaya geldi. Öncelikle aşağıdaki kodu NetBeans’a eklemiş olduğunuz kütüphanenin çağrılması ve yüklenmesi için kodunuzun import kısmına yani çoğunlukla sayfa başına tüm sınıfların dışına bir yere ekleyin:
import org.kxml2.io.*;
import org.xmlpull.v1.*;

Bundan sonra kütüphaneyi uygulamanızda kullanabilirsiniz. Kütüphanenin tanıyacağı XML yapısı aşağıdaki şekildedir, ayrıca yorum ve CDATA gibi kısımlar da tanınır (ancak kullanılır mı incelemedim).

<eleman>
<metin>metin1</metin>
<metin>metin2</metin>
</eleman>

Bu kodu da şu şekilde bir kod ile çözümleyebiliriz:


String string = "XML içeriğimiz, dosyamız vs.";
KXmlParser XMLicerik = new KXmlParser();
ByteArrayInputStream stream = new ByteArrayInputStream(string.getBytes("UTF-8"));
reader = new InputStreamReader(stream, "UTF-8");
XMLicerik.setInput(reader);
XMLicerik.nextTag();
XMLicerik.require(XmlPullParser.START_TAG, null, "eleman");
while(XMLicerik.nextTag() == XmlPullParser.START_TAG) {
XMLicerik.require(XmlPullParser.START_TAG, null, "metin");
System.out.println("metin içeriği: "+ XMLicerik.nextText());
XMLicerik.require(XmlPullParser.END_TAG, null, "metin");
}
XMLicerik.require(XmlPullParser.END_TAG, null, "eleman");

Burada XMLicerik adında bir KxmlParser oluşturduk. Buna da ByteArrayInputStream şeklinde bir giriş akıntısı (! InputStream – Türkçe ne desem ki 🙂 ) içeriği verdik. Türkçe içerikte String nesnemizi Byte‘a çevirirken kullandığımız getBytes() metodunda parametre olarak “UTF-8” girmezsek karakter problemi yaşıyoruz. Veya getInputEnchoding() yöntemini XMLicerik öğemize uygulayarak kodlama biçimini alıp ona özel işlem de yapabiliriz. Daha sonra da setInput() metoduna verdiğimiz parametre ile de XMLicerik için bir giriş nesnesi belirleyip işlemeye başlayabiliyoruz. Kullandığım nextTag() bir sonraki XML etiketine gider. require() yönteminin parametreleri ile etiketin bir başlangıç etiketi olup olmadığı ve bizim önceden belirlediğimiz eleman ismindeki etiket olup olmadığı kontrol edilir. Aslında buna gerek yoktur, sadece işi yavaşlatır, ancak bol hata olma ihtimali olan durumlarda da iyidir. nextText() yöntemi ile de belirlediğimiz etiket içindeki veri alınır.

Bu örnekteki birkaç taneden başka kütüphanede çok daha fazla miktarda faklı işi görecek metod var, bunların tümünü görmek için de NetBeans’ı kullanabilirsiniz. Şimdilik hepsini teker teker inceleyip anlatmam zor. 🙂