Merhaba Değerli Java Dostları,
Bu yazımda çok kullanılan xml teknolojisinin, Java ile nasıl kullanılacağına en basit haliyle değinmeye çalışacağım. Java ile xml işlemleri yaparken bir çok yöntem kullınabilir. Bunlardan ilki ve en basiti SAX API’ dir. Simple Api For XML şeklinde açılıma sahip olan bu kütüphane ile temel edinmeye çalışacağız. Yazının pdf formatına buradan ulaşabilirsiniz.
Xml ile çalışabilmemiz için dosyanın belirli bir kurala göre formatlanması gerekir. Yani Java ile xml dosyasını işlerken nasıl bir yapının dosyada olduğunu bilmemiz lazım. İşte bize bu yapı veya diğer değişle kuralı sağlayan dosya yapısı dtd dosyasıdır. NetBeans ile yapılmış örnek bir dtd dosyası aşağıda görünmektedir.
Artık elimizde bir kural tablosu var ve bu dtd dosyasına göre xml dosyamızı oluşturuyoruz.
Sıra geldi kod kısmına. Hemen kullanacağımız import kısımlarını göstermek istiyorum.
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; |
Xml dosyası üzerinde işlem yapabilmemiz için bir arayüze ve bunun override edilecek metotlarına ihtiyacımız var. İşte bu arayüz ContentHandler arayüzü. ContentHandler arayüzünü kullandıktan sonra NetBeans bizden bazı metotların tekrar yazılmasını yani override edilmesini isteyecek. İşte o metotlar.
Şimdi override edilen metotlara kısaca göz atalım. SetDocumentLocator metodu işlemlerden önce bir defa çağrılan metottur. StartDocument metodu dosya işlenmeye başlandığında çağrılan metottur. Yine aynı mantıkla endDocument ise işlem bitimi sonucunda çağrılır. StartPrefixMapping ve endPrefixMapping metotlarını bu uygulamada kullanmayacağız. Eğer dtd yerine başka bir kural yöntemi kullansaydık bu metotlar etkin olacaktı. StartElement ve endElement metotları kendi belirlediğimiz taglarla işlem yapmak da kullanılacak. Son metot ise characters metodu. Bu metot ile koşulumuzu sağlayan tag ile karşılaşıldığında aradaki metin bilgisini alacağız. Tam kod tabloda görülmektedir.
package xml; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class Main implements ContentHandler { private Locator lctr; private boolean sehirVar = false; public Main() { try { XMLReader okuyucu = XMLReaderFactory.createXMLReader(); okuyucu.setContentHandler(this); okuyucu.parse(new InputSource(new FileInputStream(new File(“tablo.xml”)))); } catch(IOException e) { e.printStackTrace(); } catch(SAXException e) { e.printStackTrace(); } } public static void main(String[] args) { new Main(); } public void setDocumentLocator(Locator locator) { lctr = locator; } public void startDocument() throws SAXException { System.out.println(“XML okuma islemi basladi…”); } public void endDocument() throws SAXException { if(sehirVar == false) System.out.println(“Aradiginiz sehir yok…”); else System.out.println(“Aradiginiz sehir dosyada var…”); } public void startPrefixMapping(String prefix, String uri) throws SAXException {} public void endPrefixMapping(String prefix) throws SAXException {} public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { System.out.println(“Karsilasilan element>>>” + localName); } public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println(lctr.getLineNumber()); } public void characters(char[] ch, int start, int length) throws SAXException { if(new String(ch, start, length).equals(“Kayseri”)) sehirVar = true; } public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {} public void processingInstruction(String target, String data) throws SAXException {} public void skippedEntity(String name) throws SAXException {} } |
Koda baktığımızda yapılandırıcı içerisinde gerekli ayar ve bağlantıların yapıldığı hemen görülmektedir. Bunun yanı sıra Locator nesnesi xml dosyası hakkında o an bilgi elde etmek için kullanılmaktadır. İmlecin kaçıncı satırda ve sütunda olduğu gibi. Böylece daha kolay çözümleme işlemi sağlanmaktadır. SAX işlemlerinin dezavantajı xml dosyasının bir defa baştan sona okunup çözümlenmesi ve geride kalan yere bir daha dönülmemesidir. Dolayısıyla küçük kapasiteli uygulamalarda kullanılabilir. Bu dezavantajı giderecek işlemler ise DOM ile yapılmaktadır. Sonraki yazımda DOM ile karşınızda olmayı ümit ediyorum.
Bol Java’ lı günler dileğiyle…
Yazan: Faruk BOZAN (Yazılım Mimarı / Software Architect)