Merhabalar arkadaşlar. XSTream İle Java’dan XML’e Veri Dönüşümü yazısında elimizdeki Java nesnelerinde tutulan verilerin XML’ dönüşümünü görmüştük. Bu yazıda da elimizdeki XML formatındaki verilerden nasıl Java nesnelerinde veriler elde edeceğiz onu göreceğiz.

Bu yazıdaki kaynak kodlara https://github.com/ilkgunel/XStreamDemoProject adresinden erişebilirsiniz.

Şimdi konuyu inceleyelim.

Bizim şöyle bir XML dosyamızın olduğunu varsayalım:

<person>
  <name>İlkay</name>
  <surname>Günel</surname>
  <address>
    <district>Şişli</district>
    <city>İstanbul</city>
  </address>
</person>

XSTream ile bu XML dosyasını okumak için ihtiyacımız olan Java kodu şu şekilde olacaktır:

package com.ilkaygunel.mainclasses;

import java.io.File;
import com.ilkaygunel.pojo.Address;
import com.ilkaygunel.pojo.Person;
import com.thoughtworks.xstream.XStream;

public class SinglePersonFromXML {
	public static void main(String[] args) {
		XStream xStream = new XStream();
		xStream.alias("person", Person.class);
		xStream.alias("address", Address.class);

		try {
			File xmlFile = new File("/Users/ilkaygunel/Desktop/person1.xml");
			Person person = (Person) xStream.fromXML(xmlFile);
			System.out.println(person);
		} catch (Exception e) {
			System.out.println("The Error is:"+e);
		}
	}
}

Java’dan XML’e dönüşüm yaparken yaptığımız gibi XML’den Java’ya dönüşüm yaparken de alias atamaları yapıyoruz. Person ve Address sınıfılarını alias() metodu ile tanıtıyoruz.

try-catch bloğu içerisinde de XML dosyamıza referans olan File nesnemizi oluşturuyoruz ve xStream nesnesi üzerinden fromXML() metoduna File nesnesini parametre vererek Person nesnemizi elde ediyoruz. fromXML() metodu Object tipinde bir nesne döndüğü için dönen nesnenin ilgili sınıfa cast edilmesi gerekmektedir. Bu sınıf örneğimizde bizim için Person sınıfıdır.

Son olarak da person nesnemizi konsola yazdırıyoruz. Person nesnesinin düzgün ve anlamlı yazdırılabilmesi için toString metodunun override edilmesi gerekmektidir:

@Override
public String toString() {
    return name + " " + surname + " " + address;
}

Kodu çalıştırdığımızda ekran çıktımız da şu şekilde olmaktadır:

Ekran çıktısında gördüğünüz

Security framework of XStream not initialized, XStream is probably vulnerable.

yazısı XSTream içerisinde henüz kullanımı zorunlu tutulmayan güvenlik yapısına işaret etmektedir. Bu uyarıyı çözümlemek için default security alanını kayda geçirip Person ve Address sınıflarını izin verilen sınıflar arasına ekleyebiliriz. Bu işlem için koda şu ekleme yeterli olacaktır:

XStream.setupDefaultSecurity(xStream);
Class<?>[] classes = new Class[] { Person.class, Address.class };
xStream.allowTypes(classes);

Şimdi de birden fazla veri barındıran bir XML dosyasından nasıl Java nesneleri elde ederiz bu konuya değinelim.

XML dosyamızın şu şekilde olduğunu varsayalım:

<personList>
  <person>
    <name>Michael</name>
    <surname>Schumacher</surname>
    <address>
      <district>Hürth-Hermülheim</district>
      <city>Germany</city>
    </address>
  </person>
  <person>
    <name>Mika</name>
    <surname>Hakkinen</surname>
    <address>
      <district>Helsinki</district>
      <city>Finland</city>
    </address>
  </person>
  <person>
    <name>Fernando</name>
    <surname>Alonso</surname>
    <address>
      <district>Oviedo</district>
      <city>Spain</city>
    </address>
  </person>
</personList>

Bu XML’i okumak için Java sınıfımız da şu şekilde olacaktır:

package com.ilkaygunel.mainclasses;

import java.io.File;

import com.ilkaygunel.pojo.Address;
import com.ilkaygunel.pojo.Person;
import com.ilkaygunel.pojo.PersonList;
import com.thoughtworks.xstream.XStream;

public class MultiplePersonFromXML {
	public static void main(String[] args) {
		XStream xStream = new XStream();
		XStream.setupDefaultSecurity(xStream);
		xStream.alias("person", Person.class);
		xStream.alias("address", Address.class);
		xStream.alias("personList", PersonList.class);
		xStream.addImplicitCollection(PersonList.class, "list");
		Class<?>[] classes = new Class[] { Person.class, Address.class, PersonList.class };
		xStream.allowTypes(classes);
		try {
			File xmlFile = new File("/Users/ilkaygunel/Desktop/person1.xml");
			PersonList personList = (PersonList) xStream.fromXML(xmlFile);
			for (Person p : personList.getList()) {
				System.out.println(p);
			}
		} catch (Exception e) {
			System.out.println(e);
		}
	}
}

MultiplePersonFromXML sınıfı içerisinde az önce bahsettiğim security işlemi için bir default security kayda geçiriyoruz ve XStream.setupDefaultSecurity(xStream); satırı ile bu işlemi gerçekleştiriyoruz. Bu işlemi yapıyorsak eğer işimiz olan sınıflara da izin vermemiz gerekiyor. Class<?>[] classes = new Class[] { Person.class, Address.class, PersonList.class }; satırı ile bizim işimiz olan 3 sınıfı bir dizide tanımladık ve xStream.allowTypes(classes); satırı ile de bu sınıflara izni veriyoruz. Aksi takdirde bize ForbiddenClass şeklinde bir hata dönecektir.

tyr-catch bloğu içerisinde de önceki örnekte yaptığımız gibi File nesnesini oluşturup, fromXML metoduna veriyoruz. Burada XML’e dikakt ettiğimizde en üst eleman personList elemanı. Yani XML birden fazla person barındırıyor ve cast işleminin de PersonList metoduna yapılması gerekiyor.

PersonList nesnesini elde ettikten sonra da nesne içerisindeki liste üzerinde dönerek konsola yazdırıyoruz.

Kodu çalıştırınca ekran çıktısı şöyle olmakta:

Bu yazıda anlatacaklarım da bu kadar arkadaşlar. Önceki yazı ve bu yazı ile birlikte XStrem ile Java’dan XML’e ve XML’den Java’ya dönüşüm yapmayı öğrenmiş olduk. Başka bir yazıda görüşene kadar sağlıcakla kalın.

Selam ve Sevgilerimle