Thursday, November 1, 2001

Basit XPath Örneği

Bu yazımızda XPath ve DOM kullanarak basit XML işleme örneklerini göreceğiz. İlk lazım olan, XML dosyasını sabit diskten okumaktır.

  public Document belgeOku() {
try {
// yapici fabrika yarat
DocumentBuilderFactory fabrika = DocumentBuilderFactory.newInstance();
factory.setValidating(false);

// yapiciyi yarat ve dosyayi islemeye basla
Document belge = fabrika.newDocumentBuilder().parse(new File("ornek.xml"));
return belge;
} catch (SAXException e) {
// A isleme hatasi var, XML dosyasi icinde bir yanlislik olabilir.
} catch (ParserConfigurationException e) {
} catch (IOException e) {
}
return null;
}

Lazım olan import kelimelerini üste koymayı unutmayın.

import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.util.*;
import java.io.*;

Şimdi, 'kategoriler' etiketi altindaki bilgileri almak için gereken XPath komutunu görelim.

  public NodeList butunKategorileriBul()
{
Document doc = belgeOku();
String xpath = "/kategoriler/*";
try {
// Uyan elemanlari geri getir.
NodeList dugumListe = org.apache.xpath.XPathAPI.selectNodeList(doc, xpath);
return dugumListe;

} catch (javax.xml.transform.TransformerException e) { }

return null;

}

Bu listeyi aldıktan sonra, listedeki düğümler içinden, özellik değerlerini (attributes) çıkartmamız gerekiyor. Bu değerler baslik= tabirinden sonra gelen değerler olacak.

  public ArrayList ozellikleriCikar(NodeList liste)
{
ArrayList dizin = new ArrayList();
for (int i=0; i < liste.getLength(); i++) {
Element elem = (Element)liste.item(i);

// Eleman altindaki butun ozellikleri geri getir
NamedNodeMap ozellikler = elem.getAttributes();

// Ozellik sayisini getir
int ozSayisi = ozellikler.getLength();

// Her ozelligi isle
for (int j=0; j < ozSayisi; j++) {
Attr ozellik = (Attr)ozellikler.item(j);

// Ozellik isim ve degeri getir.
String ozIsim = ozellik.getNodeName();
String ozDeger = ozellik.getNodeValue();
dizin.add(ozDeger);
}
}

return dizin;
}


Artık ayrı bir JUnit birim test sınıfı altında şunları kullanabilirsiniz.

  public void testArticleListeDetay() throws Exception {
ArticleList liste = new ArticleList();
assertTrue (
(liste.ozellikleriCikar(liste.butunKategorileriBul())).contains("eCRM")
);


Örnek bir XML dosyasını aşağıda veriyoruz.

<?xml version="1.0" encoding="iso-8859-9"?>
<kategoriler>
<kategori baslik="eCRM">
<yazi>a_etl.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_hangi_verileri_alalim.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_internet_veri_ambari.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_musteri_kayitlari.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_oracle_kavramlari.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_oracle_kullanim.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_oracle_parallel.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_oracle_query_optimize.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_veri_madenciligi.xml<tarih>19 Nisan 2002</tarih></yazi>
</kategori>
<kategori baslik="Genel">
<yazi>a_acik_anahtar_sifreleme.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_continous_integration.xml<tarih>19 Nisan 2002</tarih></yazi>
<yazi>a_cvs.xml<tarih>19 Nisan 2002</tarih></yazi>
</kategori>
</kategoriler>



Örnekleri derleyebilmek için en son Xalan sürümünü indirmeniz gerekiyor.

XML ne işe yarar

Bu yazımızın konusu XML olacak. İnternet programcılığında XML en son büyük gelişmelerden biri oldu. Ama nedir? Ne işe yarar?

Önce XML'in tarihine bir bakalım. Aslında XML bir dosya format'ından başka bir sey değildir. Format = Kayıt Şekli. HTML kayıt tipi ile XML birbirine çok benzer. Her ikisinde de başlangıç ve bitiş komutları (etiketleri) vardır, arasında kalanlar ise o etiketin altına girerler.

HTML ile XML arasındaki fark, XML şeklinin "açık" oluşudur. HTML ile sadece belli komutları kullanabilirsiniz. Mesela H1 komutu, takibinde gelen yazıları daha koyu renkli göstermenizi sağlar. Bu kurallar, İnternet kurulları tarafından böyle kabul edilmiştir ve sizin tarayıcı programınız yazıları H1 için koyu gösterir.

Fakat XML dünyasında istediğiniz baslangıç/bitiş komutlarını kullanabilirsiniz. Bu yüzden XML programcılarin düşlediği veri transfer şekli haline gelmiştir.

Bu arada hemen belirtelim: Kimisi derki, "ah ne güzel, XML ile istediğimi tanımlarım, ve yollarım, karşı tarafta onları okur.

Bu tabii ki yanlis bir görüştür. Karşiı tarafın da aynı veriyi almaya "hazırlıklı" olması gerekir. Eğer beklenmeyen veriyi gönderirseniz karşı tarafı, o verileri ekrana yazmaktan başka bir sey yapamaz. Ama hazırlıklı ise onlar üzerinde belli işlemler yapılabilir. XML'in avantajı esasında bir çok 'genel-işlemci' program sağlamış olmasıdır, 'özel-işlemciler' genel işlemciler kullanılarak programcılar tarafından yazılır.

Bir soru daha soralım kendimize: "Eğer istediğim seyi tanımlamak istersem, düz dosya kullanarak ta yollarım. XML'e niye ihtiyacım var?".

Bunun cevabı şöyle: XML, aynen HTML gibi başlangıç/bitiş komutları arasında 'ağaca benzer', yani hiyerarşik, yani dal-budak şeklinde bir ilişki kurulması için biçilmiş kaftandır. Mesela eğer bir kitap yazmak için XML kullanmak istiyorsanız, tepeden başlayarak

<kitap>
<paragraf>
İ�te bu bir paragraf yazısı..
</paragraf>
<paragraf>
İkinci paragraf yazısı..
</paragraf>
</kitap>

.. gibi bir ilişki kurabilirsiniz. Bu kayıtta gayet açıkça görülüyor ki, kitap ve paragraflar arasında bir ilişki var. Bu dal-budak ilişkisini istediğiniz kadar aşağı indirebilirsiniz.

Düz dosya ile böyle iliskileri göstermek çok zordur.

O yüzden, "İnternet yayıncılığı" için, XML biçilmis kaftandır.

Programlar arasında veri alışverişi için de XML cok yararlıdır.