Ana içeriğe atla

DOM ile hazırlanmış XML yapısını dosyaya aktarma

Bugün derste öğrencilerden birinin sorusu üzerine DOM'da XML yapısını dosyaya aktarmayı gösteren örnek bir uygulama hazırladım. Bu örnek uygulamada XML yapısının çalışma zamanında hazırlanmasını ve işlem bittikten sonra dosyaya aktarılmasını görebilirsiniz.

DOMXMLDosya.java:
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

/**
* Bir xml belgesi yaratma ve belgeyi dosyaya kaydetme
*
* @author Tahir Emre KALAYCI, http://kodveus.blogspot.com
* @version $Id: DOMXMLDosya.java,v 1.0 11.12.2007 09:36:55
*/
public class DOMXMLDosya {
public static void main(final String[] args) throws IOException {
// Sinifi ilkleyelim
final DOMXMLDosya dw = new DOMXMLDosya();
// XML belgesini olusturalim
final Document doc = dw.docOlustur();
// XML belgesini dosyaya kaydedelim
dw.xmlDosyayaKaydet(doc, "deneme.xml");
}

/** XML belgesini olusturalim */
protected Document docOlustur() {
try {
// Bos belgeyi yaratiyoruz
final DocumentBuilderFactory fact = DocumentBuilderFactory
.newInstance();
final DocumentBuilder parser = fact.newDocumentBuilder();
final Document doc = parser.newDocument();

// Kok elemani olarak "Kisiler" yaratiliyor
final Node kok = doc.createElement("Kisiler");
// Belgemize kokumuzu ekleyelim
doc.appendChild(kok);

// Kokumuze yeni bir kisi ekleyelim
kisiEkle(doc, kok, new Kisi("Mustafa", "Az", "1901"));
// Kokumuzu yeni bir kisi ekleyelim
kisiEkle(doc, kok, new Kisi("Ahmet", "Çok", "1902"));

// Yaratilan DOM XML belgesini dondurelim
return doc;

} catch (final Exception ex) {
ex.printStackTrace();
return null;
}
}

/**
* Bu metodun amaci parametre olarak verilen kisiyi xml belgesine eklemek
*
* @param doc
* Eklenecegi xml belgesi
* @param kok
* Eklenecegi kok
* @param kisi
* Kisinin bilgilerini tutan sinif
*/
private void kisiEkle(final Document doc, final Node kok, final Kisi kisi) {
// Kisi elemanini olusturuyoruz
final Node kisiNode = doc.createElement("Kisi");
// Kokumuze ekliyoruz
kok.appendChild(kisiNode);

// Kisinin isim elemanini olusturuyoruz
Node node = doc.createElement("Ad");
// Kisinin isim elemanini kisi elemanina ekliyoruz
kisiNode.appendChild(node);
// Isim bilgisini ekliyoruz
node.appendChild(doc.createTextNode(kisi.getAd()));

// Kisinin soyad elemanini olusturuyoruz
node = doc.createElement("Soyad");
// Kisinin soyad elemanini kisi elemanina ekliyoruz
kisiNode.appendChild(node);
// Soyad bilgisi ekliyoruz
node.appendChild(doc.createTextNode(kisi.getSoyad()));

// Kisinin numara elemanini olusturuyoruz
node = doc.createElement("Numara");
// Kisinin numara elemanini kisi elemanina ekliyoruz
kisiNode.appendChild(node);
// Numara bilgisini ekliyoruz
node.appendChild(doc.createTextNode(kisi.getNumara()));
}

/**
* Bu metod DOM xml belgesini bir dosyaya kaydetmemize yarar
*
* @param doc
* kaydedilecek DOM XML belgesi
* @param filename
* kaydedecegimiz dosya adi
*/
public void xmlDosyayaKaydet(final Document doc, final String filename) {
try {
// DOM belgesini yazma icin hazirliyoruz
final Source source = new DOMSource(doc);

// Cikti dosyasini hazirliyoruz
final File file = new File(filename);
final Result result = new StreamResult(file);

// DOM belgesini dosyaya yaziyoruz
final Transformer xformer = TransformerFactory.newInstance()
.newTransformer();
xformer.transform(source, result);
} catch (final TransformerConfigurationException e) {
e.printStackTrace();
} catch (final TransformerException e) {
e.printStackTrace();
}
}
}

Kisi.java:

public class Kisi {
String ad;
String numara;
String soyad;

public Kisi(final String _ad, final String _soyad, final String _numara) {
ad = _ad;
soyad = _soyad;
numara = _numara;
}

public String getAd() {
return ad;
}

public String getNumara() {
return numara;
}

public String getSoyad() {
return soyad;
}

public void setAd(final String ad) {
this.ad = ad;
}

public void setNumara(final String numara) {
this.numara = numara;
}

public void setSoyad(final String soyad) {
this.soyad = soyad;
}
}

Oluşan XML Dosyası:

Yorumlar

Alper ÖZCAN dedi ki…
Kaydedeceği XML belgesi içindeki etiketlerde "Öz Nitelik" (Attribute) kullanmak isteyenler için bir bilgilendirme yapayım:

Örneğin bu örnekte verilen XML dosyası içindeki "< Kişi >" etiketlerinde attribute da kullanmak istiyorsak, "kisiEkle" adındaki fonksiyonda ilgili şu değişikliği yapmamız yeterli:

@ DEĞİŞİKLİKTEN ÖNCE:
..............
private void kisiEkle(final Document doc, final Node kok, final Kisi kisi) {
// Kisi elemanini olusturuyoruz
final Node kisiNode = doc.createElement("Kisi");
// Kokumuze ekliyoruz
kok.appendChild(kisiNode);

// Kisinin isim elemanini olusturuyoruz
Node node = doc.createElement("Ad");
..............


@ DEĞİŞİKLİKTEN SONRA:
..............
private void kisiEkle(final Document doc, final Node kok, final Kisi kisi) {
// Kisi elemanini olusturuyoruz
final Node kisiNode = doc.createElement("Kisi");
// Kokumuze ekliyoruz
kok.appendChild(kisiNode);
// Kisi Etiketine "sayi" özniteliği ekliyoruz:
kisiNode.setAttribute("sayi", "1");


// Kisinin isim elemanini olusturuyoruz
Node node = doc.createElement("Ad");
..............


Burada örnek olsun diye Kişi etiketlerine bilindik "id" değeri gibi bir sayı öz niteliği ekleniyor. Tabii ki çoklu kayıt işlemlerinizde bir for döngüsü vs. gibi kullanımınızla buradaki "1" olarak girdiğim sayı değerini "i" gibi bir değişkenle dinamik hale gerirebilirsiniz.

Son olarak oluşan XML dosyası:
deneme.xml

şeklinde bir değişime uğrayacaktır.

Bu bilgilendirici yazıyı açtığı için Tahir Emre KALAYCI'ya teşekkürlerimi sunuyorum.
Tahir Emre KALAYCI dedi ki…
Bu faydalı bilgilendirme için teşekkürler :)
Alper ÖZCAN dedi ki…
Bu arada çok özür diliyorum. Yukarıdaki yorumumda Eclipse'den kopyala-yapıştır yaparken minik bir hata yapmışım :)

Değişikliğin doğrusu aşağıdaki şekilde olmalı:

@ DEĞİŞİKLİKTEN SONRA:
..............
private void kisiEkle(final Document doc, final Node kok, final Kisi kisi) {
// Kisi elemanini olusturuyoruz
final Element kisiNode = doc.createElement("Kisi");
// Kokumuze ekliyoruz
kok.appendChild(kisiNode);
// Kisi Etiketine "sayi" özniteliği ekliyoruz:
kisiNode.setAttribute("sayi", "1");


// Kisinin isim elemanini olusturuyoruz
Node node = doc.createElement("Ad");
..............

"Node" class'ı yerine "Element" class'ı olmalıydı. Çünkü Node için bir "Attribute" atanması söz konusu olmuyor.