İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

Java'da DocumentBuilder Kullanımı

Document Builder

DocumentBuilder, dosya, URL veya stream gibi herhangi bir kaynaktaki XML belgesini okumaya yarar. DocumentBuilder bir class olmadığı için DocumentBuilderFactory gibi bir class tarafından yaratılabilir. DocumentBuilderFactory de aslında abstract bir class'tır, onun da instance'ına bir method kullanarak erişmek gereklidir. Teknik ifadeleri bir yana bırakalım va basit bir örnek verelim :

    String uri="C:\\Lesons\\ExamTest.xml";
    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
    DocumentBuilder builder=factory.newDocumentBuilder();
    Document document=builder.parse(uri);

Burada URI (Uniform Resource Indicator), yani belgenin konumun belirten string bir ifadedir. 'http://' ile veya başka bir protokolle de başlayabilirdir. Ancak Windows'un dosya sistemine göre 'C:\...' ile başlayan bir ifadede girilebilir. Burada 'parse' methoduyla dönen şey bir Document interface'idir. Document, XML belgesinin hafızaya yüklenmiş halidir. XML belgesinin içerisinden herhangi bir bilgi okumak veya bir şey eklemek için Document interface'i kulllanır. Standart bir interface olduğu için normal Java class ve interface'lerine göre kullanınmı biraz daha karışıktır fakat bir progrmacının ihtiyaç duyduğu işlevler çok az sayıda olduğu için örneklere bakarak kolaylıkla kullanılabilir.

Document Kullanımı

Document bir kez elde edilince artık yapılacak XML ağacının en üstünden başlayıp yavaş yavaş derinlere girmek olacaktır. Öncelikle en üsteki element alınır ki bu element'e 'document element' denir. Yani document'ine asıl elementi. Bu örnekte en tepedeki elementi almak için :

    Element exam=document.getDocumentElement();

gibi bir kod yazılır. Bu element'in (veya herhangi bir element'in) içerisinde belli bir isme sahip subelement / child element (alt / çocuk) element'leri) almak için şöyle bir kod yazılabilir :

    NodeList questions=exam.getElementsByTagName("question");
    Element question1=(Element)questions.item(0);
    String number=question1.getAttribute("number");
    System.out.println(number);

Burada getElementsByTagName() method'u adından da anlaşılabileceği gibi elementleri tag (etiket) adı vererek almaya yarar. Bu method'un sonucu NodeList interface'idir. Niye dizi, vector, list dönmediği sorulabilir. Ancal DOM standardı NodeList'i de tanımlar ve bu tanımlama sadece Java düşünülerek yazılmamıştır. Ancak bu interface bu sayılan nesne türlerine oldukça beznezmektedir. Gerektiğinde getLength() method'uyla element'lerin sayısı alınabilir. Belli bir index'teki elemanın almak için (yani i'inci elemanı almak içinc) item() diye bir method bulunmaktadır. Bir element'in attribute'sini almak için getAttribute() methodu bulunmaktadır. Aşağıdaki örnekte ilk sorunun numarası alınıp ekrana basılmaktadır. (Sonuç elbette 1.)

Soru'ya ilişkin element'in de alt element'leri olan şıklarını almak için benzer bir kod yazılır.

    NodeList options=question1.getElementsByTagName("option");
    Element optionB=(Element)options.item(1);
    String id=optionB.getAttribute("id");
    System.out.println(id);

Burada değişen sadece element'in ve attribute'nin adlarıdır. XML belgelerinde her şey elemet, attribute ve text'ten oluştuğu için bu benzerlik olağandır. Anca bir eleemnt'in attribute'sini değil de içerisindeki metni almak istersek daha farklı bir kod yazılır :

    NodeList children=optionB.getChildNodes();
    Text text=(Text)children.item(0);
    String value=text.getNodeValue();
    System.out.println(value);

Burada bir element'in içersinde başka bir element olma durumu yoktur. Bir elemenin içinde sadece metin vardır. Buna karşın yine de dizi almaktayız. Çünkü bir element içerisinde başka elementler olup olmadığını bilmek içerisine girmeden mümkün değildir. Ayrıca bir den fazla text element'i peş peşe bulunabilir. O yüzden içerisinde sadece metin olduğunu bildiğimiz elementlerin bile içindeki değieri çocukarından ilkini almak suretiyle elde ediyoruz.

Bu örnekte kullanılan XML :

ExamTest.xmlİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 <?xml version="1.0" encoding="ISO-8859-9">
  2 <exam id="math-3">
  3 	<title>Matematik Dersi 2. Ara Sınavı </title>
  4 	<question number="1">
  5 		<text>İki kere iki iki kaç eder?</text>
  6 		<option id="a">22</option>
  7 		<option id="b">3</option>
  8 		<option id="c">4</option>
  9 		<option id="d">5</option>	
 10 	</question>
 11 	<question number="2">
 12 		<text>Kendimi kendimden çıkarsam kaç kalır?</text>
 13 		<option id="a">1</option>
 14 		<option id="b">2</option>
 15 		<option id="c">0</option>
 16 		<option id="d">FD</option>	
 17 	</question>
 18 </exam>

Ve belirtilen öreğin toplu halde kodu :

DocumentBuilderTest.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.xml.parsers.*;
  2 import org.w3c.dom.*;
  3 import java.io.*;
  4 public class DocumentBuilderTest {
  5   public static void main(String[] args)
  6       throws Exception
  7   {
  8     String uri="C:\\Lesons\\ExamTest.xml";
  9     // Xml document
 10     DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
 11     DocumentBuilder builder=factory.newDocumentBuilder();
 12     Document document=builder.parse(uri);
 13     // Document'in root'u
 14     Element exam=document.getDocumentElement();
 15     // 1. Soru
 16     NodeList questions=exam.getElementsByTagName("question");
 17     Element question1=(Element)questions.item(0);
 18     String number=question1.getAttribute("number");
 19     System.out.println(number);
 20     // B Sikki
 21     NodeList options=question1.getElementsByTagName("option");
 22     Element optionB=(Element)options.item(1);
 23     String id=optionB.getAttribute("id");
 24     System.out.println(id);
 25     // Sikkin metni
 26     NodeList children=optionB.getChildNodes();
 27     Text text=(Text)children.item(0);
 28     String value=text.getNodeValue();
 29     System.out.println(value);
 30   }
 31 }

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır