Skip to main content

Java’da XML işlemleri

Merhabalar.

Ara ara Java ile ilgili yazılar yazmaya devam ediyorum. Bu blog yazısının konusu Java ile XML İşlemleri. Java ile XML işlemleri yapabilmek için birden çok sınıf mevcut. Fakat ben bu yazıda bu işlemleri yapmak için Document Builder isimli sınıfı kullanacağım.

Eğer XML ve XML dosyaları ile ilgili yeterli bilgiye sahip değilseniz, bu yazıyı okumadan  önce  Java’dan bağımsız olarak XML ile ilgili olarak  bir araştırma yapmanız yararınıza olacaktır.

Öncelikle Java’da XML dosyasından okuma yapabilmek için bir adet XML dosyası oluşturulması gerekiyor. Ben XML dosyasında Sanatçı isimleri ve onların şarkılarını tutmayı düşündüm. Yani XML dosyasını bir veri tabanı olarak düşünecek olursak, bu dosya Sanatçıları ve onlara ait şarkıları tutuyor.

Oluşturduğum XML dosyasının yapısı şu şekilde.

 

<?xml version="1.0" encoding="utf8"?>
<?xml-stylesheet type="text/xsl" href="sarkilar.xsl" ?>
<songs>

	<title>Sanatçı ve Şarkıları</title>
	
	<song number="1">
		<artist>Mustafa Ceceli</artist>
<option code="1"> Es </option>
<option code="2"> Sevgilim</option>
<option code="3"> Eksik </option>
<option code="4"> Limon Çiçekleri </option>
<option code="5"> 12 </option>
	</song>
	
	<song number="2">
		<artist>Haluk Levent</artist>
<option code="1"> Zor Aşk </option>
<option code="2"> Gariban</option>
<option code="3"> Zifiri </option>
<option code="4"> Oyun </option>
<option code="5"> Dert Olur </option>
	</song>

	<song number="3">
		<artist>Emre Aydın</artist>
<option code="1"> Git</option>
<option code="2"> Tam Dört Yıl Olmuş Dün</option>
<option code="3"> Bebeğim </option>
<option code="4"> Gülümse Şimdi </option>
<option code="5"> Bu Yağmurlar </option>
	</song>

	
</songs>

Şimdi bu dosyayı baz alarak okuma yapacağız. Ve okuduğumuz değerleri ekrana yazacağız. Tabi bunları aslında ekrana yazmanın bir mantığı yok. Ama okumayı başardıktan JDBC ile ya da başka bir şekilde bu değerleri bir Veri tabanına yazabilirsiniz. Aslında gerçek daha çok bunun için kullanacağınızı bilmeniz önemli.

Şimdi de okuma işlemini yaptığımız Java projesinin kaynak kodlarını paylaşalım. Kaynak kod ile ilgili tüm açıklamaları kodun içerisinde ince ayrıntısına kadar belirtmeye çalıştım. Eğer yine de anlaşılmayan bir nokta olursa bu blog yazısının altına yorum olarak sorarsanız memnuniyetle cevap vereceğimi belirtmek isterim.

Son olarak eklemek istediğim bir şeyde oluşturduğum bu sınıftaki public static Document getDocument(String uri) tanımlamasına sahip olan static metodun içinde olanlar. Bu metot aslında Tasarım Desenleri’nden biri olan Factory Pattern’i kullanarak arka planda XML dosyasını elde etmemizi sağlıyor. Eğer Tasarım Desenleri kavramına uzaksanız fazla düşünmenize gerek yok. Şu anlık sadece Java’da XML’den okuma yapmak için bir Document nesnesi elde etmemiz gerektiğini ve bu nesneyi de bu şekilde elde ettiğimizi bilmemiz yeter.

 


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.aytaccici.xml;

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Aytac CİCİ
 * 29 Ekim 2016
 */
public class XmlParser {

    public static void main(String[] args) {

        Document document = null;
        try {
           //Buraya proje dizinindeki XML dosyasının yolunu gösterin.
            String path = "C:\\Users\\Aytac\\Documents\\NetBeansProjects\\"
                    + "XMLProject\\sarkilar.xml";
            
            //Verdiğimiz yolda bulunan XML dosyası ele alınıyor ve Parse edildi.
            //Artık elimizde işlem yapacağımız bir döküman var. Ve biz bu dökümanın
            //özelliklerine tek tek erişeceğiz. 
            //Bu aşamadan sonraki kodları anlamak için XML dosyasını dikkatlice inceleyin.
            
            document = getDocument(path); //sarkilar.xml isimli dosyasmızı ele aldık.
           
        } catch (ParserConfigurationException | SAXException | IOException ex) {
            System.out.println(ex.getMessage()); // Dosya bulunamazsa hata fırlatılacak
        }
       
        Element songs = document.getDocumentElement(); 
        // Bizim XML dosyamızdaki kök elemente ulaşıyoruz. Bizde bu elementin adı
        // <songs> isimli element. Bundan sonra bu etiketin içindeki 
        // verilere erişebiliriz
        
    
        // Burada "songs" ekrana yazdırılıyor.  
        // getNodeName elementin adını almak için kullanulır
        System.out.println("Root Element Değeri : " + songs.getNodeName());
        //Şimdi Root element olan şeyin bir attribu değerini yazdıralım.
  
        /*** 
             XML dosyası incelenirse. burada "title" isimli bir etiket var.
             ve dikkat çeken bir nokta bu etiketin tek bir tane olduğu.
            Yani bu XML dosyası içinde tekrar etmeyeceğ anlamına geliyor.
            * Fakat kullandığımız sınıf bunu bilemez. Bunun bizim özellikle 
            * belirtmemizlazım. getSingleChildText metodunu kullanarak "title"
            * isimli etiketin içindeki değeri alıyoruz. item(index) metodu 
            * ile sıfırıncı elamana eriştiğimize dikkat edin.
         
         **/
       
        String title= getSingleChildText(songs,"title");
        System.out.println("Baslık : " + title);
        
        /**Bundan sonraki işimiz XML içinde devamlı tekrar eden etiketlerle.  XML
         dikkatli bir şekilde incelendiğinde "song" etiketinin devamlı bir şekilde
         dosya içnde tekrar ettiği görülüyor. İlk olarak  Song etiketini cocuklarıyla beraber
         bir elde edelim. getElementsByTagName metodu geriye bir NodeList döndürür.
         Bizim iç içe üc tane  "song" etiketimiz var. Bu sebeple bu etiketle ilgili
         islemler yaparken dönkü kullanacağımızı aklımızdan çıkarmayalım**/
        NodeList songList = songs.getElementsByTagName("song");
        
        /**Bzim örneğimize göre her bir song etikti için bu döngünün dönmesi lazım.
         Üc tane song etiketine sahip olduğumuza göre üc defa dönecek.*/
        for (int i = 0; i < songList.getLength(); i++) {
            //Birden fazla song olduğu için. O an hangi song etiketi üzerinde isek
            //onunla ilgili islem yapmamız gerekiyor. yine item(index) özelliğini
            //kullanarak  her bir sarkıcıya erisiyoruz. item(0) dediğimizde ilk sıradaki
            //song etiketine sahip Elementi elde etmiş oluyruz. item özelliği aslında bize
            // bir node döndürür. Ama biz dönen şeyin bizim örneğimize göre bir element oldugu
            //biliyoruz. bu sebeple (Element)'e cast ettik.
            Element song = (Element) songList.item(i);
          
            // getAttribute("özellik_adi") 
            // istediğimiz özelliğin değerini öğrenebiliriz.
            String artistNumber=song.getAttribute("number");
            //getSingleChildText() metodunu biz tanımladık. 
            // Bir node ve bir  etiket ismi alıyor. XML dosyası incelenirse 
            // artist isimli tag devam etmiyor. Her bir song etiketi içinde
            // bir tane var. Bu sebeple bizim ilk olana erismemiz gerek. getSingleChildText
            // ile aslında index'i sıfır olan elementin String değerini döndürmekten
            //başka bir şey yapmıyoruz.
             String artistName = getSingleChildText(song, "artist");
            
             System.out.print(artistNumber+ "-" + artistName + "\n");
             
             //Şimdi devam edelim. Artık her bir sanatcinin sarkilarini almak vakti
             // sanatcilarin sarkilarini ben option isimli bir tagın içine almıstım
             // bu sebple  getElementsByTagName'e referans olarak option'u geciriyorum.
             // option özelliğini song isimli Element'te aradığımıza dikkat edin!
             NodeList trackList = song.getElementsByTagName("option");
             // Artık elimizde sarkı listesi var. Tek yapmamız gereken listede kac eleman varsa
             // her bir song etiketi için, döngüyü o kadar döndürmek.
             // yukarı da da benzer bir işlem yapmıştık.
            for (int j = 0; j < trackList.getLength(); j++) {
                Element option = (Element) trackList.item(j);

                System.out.println("Sarki No: " + option.getAttribute("code") + " -" + option.getTextContent());;

            }
            System.out.println("-------------------------------------------");
        }

    }

    public static String getSingleChildText(Element element, String tagName) {

        //Bu metod ile XML tagının içinde sadece bir kez geçen
        //elementlerin değerini alıyoruz.
        String body = element.getElementsByTagName(tagName).item(0).getTextContent();

        return body;

    }

    public static Document getDocument(String uri) throws ParserConfigurationException, SAXException, IOException {
        
        //Bu metod bize bir document döndurur. Factory Design Patternini 
        // kulanarak yapar bu işlemi. Ayrıntıyı fazla bilmenize gerek yok. Ama
        // eğer merak ediyorsunuz internette Factory Pattern ile arastırma yapabilirsiniz.
        // Su anlık böyle bir şeye ihtiyac duyduğunuzda bu şekilde kullanmayı bilmeniz yeterli olur.
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(uri);
        return document;
    }

}

Son olarak projenin kaynak kodlarını da paylaşarak yazıya burada son veriyorum.

XML Project İndir

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Aytaç Cici

İstanbul Üniversitesi Bilgisayar Mühendisliği mezunu bir Yazılım Geliştirici. Çeşitli zamanlarda Java, PHP, C# ve Delphi gibi diller kullanarak yazılım geliştirmiştir. Bir dönem SEO alanında da çalışmalar yapmıştır.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Email
Print