Merhabalar,
Bugün Castor ile projelere devam ettim. Bu sefer önümdeki problem sınıfın içinde başka bir sınıf objelerini tutan hashmap objesini nasıl XML'e aktarırım ve oradan geri nasıl okurum(marshalling ve unmarshalling) oldu. Bunu küçük bir araştırma ve denemelerden sonra çözdüm. Burada olayı nested class olarak çözmeye çalışmamız gerekiyor. mapping.xml i aşağıya koyuyorum daha anlaşılır olacaktır.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
<field name="map" collection="map"> <!-- Birinci map java kısmındaki HashMap objesinin adı, ikincisi ise collection tipi(Yani bildiğimiz java.util.Hashmap'ın kısaltması) -->
<bind-xml name="mappp" node="element">
<class name="org.exolab.castor.mapping.MapItem"> <!-- içiçe sınıf -->
<field name="key" type="java.lang.String"> <!-- hashmap key'i -->
<bind-xml name="key"/>
</field>
<field name="value" type="Branch"/> <!-- Hashmap'ta tutulan obje -->
</class>
</bind-xml>
</field>
</class>
<class name="Branch"> <!-- Branch sınıfı tanımlaması -->
<map-to xml="Branch"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="element"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Kodları koymuyorum fakat aklınıza takılan herhangi birşey olursa sorabilirsiniz. Şimdilik bu kadar, kolay gelsin.
29 Temmuz 2011 Cuma
Castor ile HashMap objesini XML'e Çevirme ve Geri Oluşturma
Castor ile Mapping Kullanarak XML Veri Dönüştürme
Merhabalar,
Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)
Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.
HeadQuarter.Java
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class HeadQuarter{
private String name = "";
private int size = 0;
private ArrayList<String> rooms = new ArrayList<String>();
private Vector<String> floors = new Vector<String>();
private Date dob = new Date();
private ArrayList<Branch> branch = new ArrayList<Branch>();
public HeadQuarter(String name, int size, ArrayList<String> rooms,
Vector<String> floors, Date dob, ArrayList<Branch> branch) {
super();
this.name = name;
this.size = size;
this.rooms = rooms;
this.floors = floors;
this.dob = dob;
this.branch = branch;
}
public ArrayList<Branch> getBranch() {
return branch;
}
public void setBranch(ArrayList<Branch> branch) {
this.branch = branch;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList<String> getRooms() {
return rooms;
}
public void setRooms(ArrayList<String> rooms) {
this.rooms = rooms;
}
public Vector<String> getFloors() {
return floors;
}
public void setFloors(Vector<String> floors) {
this.floors = floors;
}
public HeadQuarter(){}
}
Branch.java
public class Branch {
private String branchName = "";
private int numberOfWorkers = 0;
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public int getNumberOfWorkers() {
return numberOfWorkers;
}
public void setNumberOfWorkers(int numberOfWorkers) {
this.numberOfWorkers = numberOfWorkers;
}
public Branch(String branchName, int numberOfWorkers) {
super();
this.branchName = branchName;
this.numberOfWorkers = numberOfWorkers;
}
public Branch(){}
}
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branch" type="Branch" collection="arraylist">
<bind-xml name="Branches" node="element"></bind-xml>
</field>
</class>
<class name="Branch">
<map-to xml="Branches"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
/**
* @param args
* @throws IOException
* @throws ValidationException
* @throws MarshalException
* @throws MappingException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
// TODO Auto-generated method stub
ArrayList<String> rooms1 = new ArrayList<String>();
rooms1.add("firstroom");
rooms1.add("secondroom");
rooms1.add("thirdroom");
Vector<String> floors1 = new Vector<String>();
floors1.add("firstfloor");
floors1.add("secondfloor");
Date dob = new Date(2011,12,22);
ArrayList<Branch> branch = new ArrayList<Branch>();
branch.add(new Branch("Umraniye", 500));
branch.add(new Branch("Maslak", 275));
HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
// Marshalling Starts
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
XMLContext context = new XMLContext();
context.addMapping(mapping);
FileWriter writer = new FileWriter("output.xml");
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
Marshaller marshaller = context.createMarshaller();
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
marshaller.marshal(hq);
// Marshalling ends
// Unmarshalling Starts
FileReader reader = new FileReader("output.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setMapping(mapping);
unmarshaller.setClass(HeadQuarter.class);
HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
// Unmarshalling ends
}
}
Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdilik bu kadar. Esen kalın.,
Çalışmalara Castor ile devam ediyorum. Dün mapping dosyası olmadan Castor ile nasıl XML verisini dönüştürebileceğimizi araştırmıştım. Bugün de mapping dosyası ile bu iş nasıl oluyor onu araştırdım ve güzel deneyimler elde ettim. Projede dünkünden farklı sınıflar kullanarak öğrenme seviyemi yükselmiş bulunuyorum :)
Sınıflardan biraz bahsetmek gerekirse, HeadQuarter ve Branch sınıflarında çeşitli değişkenler var, aşağıdaki kodda daha iyi görülebilir, ve bu sınıflar arasında "has a relationship" bağlantısı bulunmakta. Ayrıca main metodumuzun bulunduğu Main sınıfımız da her zamanki yerinde duruyor. Şimdi kodlara geçelim.
HeadQuarter.Java
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
public class HeadQuarter{
private String name = "";
private int size = 0;
private ArrayList<String> rooms = new ArrayList<String>();
private Vector<String> floors = new Vector<String>();
private Date dob = new Date();
private ArrayList<Branch> branch = new ArrayList<Branch>();
public HeadQuarter(String name, int size, ArrayList<String> rooms,
Vector<String> floors, Date dob, ArrayList<Branch> branch) {
super();
this.name = name;
this.size = size;
this.rooms = rooms;
this.floors = floors;
this.dob = dob;
this.branch = branch;
}
public ArrayList<Branch> getBranch() {
return branch;
}
public void setBranch(ArrayList<Branch> branch) {
this.branch = branch;
}
public Date getDob() {
return dob;
}
public void setDob(Date dob) {
this.dob = dob;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList<String> getRooms() {
return rooms;
}
public void setRooms(ArrayList<String> rooms) {
this.rooms = rooms;
}
public Vector<String> getFloors() {
return floors;
}
public void setFloors(Vector<String> floors) {
this.floors = floors;
}
public HeadQuarter(){}
}
Branch.java
public class Branch {
private String branchName = "";
private int numberOfWorkers = 0;
public String getBranchName() {
return branchName;
}
public void setBranchName(String branchName) {
this.branchName = branchName;
}
public int getNumberOfWorkers() {
return numberOfWorkers;
}
public void setNumberOfWorkers(int numberOfWorkers) {
this.numberOfWorkers = numberOfWorkers;
}
public Branch(String branchName, int numberOfWorkers) {
super();
this.branchName = branchName;
this.numberOfWorkers = numberOfWorkers;
}
public Branch(){}
}
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="HeadQuarter">
<map-to xml="HQ"></map-to>
<field name="name" type="string">
<bind-xml name="Name" node="attribute" />
</field>
<field name="size" type="integer">
<bind-xml name="Size" node="attribute" />
</field>
<field name="rooms" type="string" collection="arraylist">
<bind-xml name="Rooms" node="element"></bind-xml>
</field>
<field name="floors" type="string" collection="vector">
<bind-xml name="Floors" node="element"></bind-xml>
</field>
<field name="dob" type="date">
<bind-xml name="building-date" node="element"></bind-xml>
</field>
<field name="branch" type="Branch" collection="arraylist">
<bind-xml name="Branches" node="element"></bind-xml>
</field>
</class>
<class name="Branch">
<map-to xml="Branches"></map-to>
<field name="branchName" type="string">
<bind-xml name="branch_name" node="attribute"></bind-xml>
</field>
<field name="numberOfWorkers" type="integer">
<bind-xml name="number_of_workers" node="element"></bind-xml>
</field>
</class>
</mapping>
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Vector;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.FieldHandler;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.mapping.loader.FieldHandlerImpl;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
/**
* @param args
* @throws IOException
* @throws ValidationException
* @throws MarshalException
* @throws MappingException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MarshalException, ValidationException, MappingException {
// TODO Auto-generated method stub
ArrayList<String> rooms1 = new ArrayList<String>();
rooms1.add("firstroom");
rooms1.add("secondroom");
rooms1.add("thirdroom");
Vector<String> floors1 = new Vector<String>();
floors1.add("firstfloor");
floors1.add("secondfloor");
Date dob = new Date(2011,12,22);
ArrayList<Branch> branch = new ArrayList<Branch>();
branch.add(new Branch("Umraniye", 500));
branch.add(new Branch("Maslak", 275));
HeadQuarter hq = new HeadQuarter("hq1",3,rooms1,floors1,dob,branch);
// Marshalling Starts
Mapping mapping = new Mapping();
mapping.loadMapping("mapping.xml");
XMLContext context = new XMLContext();
context.addMapping(mapping);
FileWriter writer = new FileWriter("output.xml");
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
Marshaller marshaller = context.createMarshaller();
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
marshaller.marshal(hq);
// Marshalling ends
// Unmarshalling Starts
FileReader reader = new FileReader("output.xml");
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setMapping(mapping);
unmarshaller.setClass(HeadQuarter.class);
HeadQuarter hq2 = (HeadQuarter) unmarshaller.unmarshal(reader);
// Unmarshalling ends
}
}
Burada kafaları karıştıracak olan kısmın mapping.xml olacağını düşünüyorum. Bunun nasıl ve hangi kurallara göre yazılacağını Castorun sitesindeki dökümanı zaten çok güzel anlatıyor olduğu için bir daha yazmıyorum ancak yine de kafanıza takılan bir yer olursa yardımcı olmaya çalışırım elbette. Zaten projeyi çalıştırdıktan sonra alacağınız çıktıyı da inceleyerek neyi nerede ve ne için kullandığımı daha iyi anlayabilirsiniz. Ayrıca, bu projeyi çalıştırmak için gerekli olan jar dosyalarını bir kez daha aşağıya yazıyorum, bunlar olmadan çalışmıyor ne yazık ki :)
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdilik bu kadar. Esen kalın.,
28 Temmuz 2011 Perşembe
Mapping Dosyası Olmadan Castor Unmarshalling Operasyonu
Arkadaşlar Merhaba,
Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.
Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,
<anonymous-tag>
<person>...</person>
<person>...</person>
</anonymous-tag>
Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.
Person.Java
import java.util.Date;
public class Person{
private String name = null;
private Date dob = null;
public Person() {
super();
}
public Person(String name) {
this.setName(name);
}
public Person(String name, Date dob) {
this.setName(name);
this.setDob(dob);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setDob(Date dob) {
this.dob = dob;
}
public Date getDob() {
return dob;
}
public String toString(){
return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
}
}
PersonList.Java
public class PersonList {
public PersonList(int number) {
super();
this.person = new Person[number];
}
public PersonList() {
super();
}
private Person[] person;
public Person[] getPerson() {
return person;
}
public void setPerson(Person[] person) {
this.person = person;
}
}
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException,
MappingException, MarshalException, ValidationException {
// Yeni Person objesi
Person person = new Person("Emre Gözen");
person.setDob(new Date(1999, 06, 29, 12, 20));
// Yeni Person objesi
Person person2 = new Person("Emre Gözen1234564");
person2.setDob(new Date(1999, 06, 29, 12, 20));
PersonList personList = new PersonList(2);
personList.getPerson()[0]=person;
personList.getPerson()[1]=person2;
// Marshalling için Writer objesi
FileWriter writer = new FileWriter("test.xml");
XMLContext context = new XMLContext();
// Marshaller objesi
Marshaller marshaller = context.createMarshaller();
marshaller.setWriter(writer);
marshaller.setSuppressXSIType(true);
// Marshalling işlemi
marshaller.marshal(personList);
// Unmarshalling için Reader
FileReader reader = new FileReader("test.xml");
XMLContext context2 = new XMLContext();
// Unmarshaller objesi
Unmarshaller unmarshaller =
context2.createUnmarshaller();
unmarshaller.setClass(PersonList.class);
// Unmarshalling işlemi
PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
// Sonucu ekrana yazdırma
for (int i = 0; i < 2; i++) {
System.out.println(personList2.getPerson()[i].getName() + "\n\n");
}
}
}
Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.
Herkese iyi günler.
Staj yaptığım yer olan Kartaca Bilişimde Castor frameworkunu incelemeye devam ediyorum halen. Bugün karşılaştığım ve çözmek için baya uğraştığım bir durumu yazacağım. Daha önceki yazımda Castor ile XML marshalling ve unmarshalling operasyonlarının nasıl yapıldığını yazmıştım. O yazıda bu işlemleri mapping.xml adında bir dosya ile gerçekleştiriyordum. Bu dosya, Castor'a XML i nasıl parçalayacağı hakkında bilgi veriyordu. Ancak bazen büyük projelerde mevcut dosyaların içine yeni bir tane XML dosyası eklemek istenilmeyen birşey olabiliyor. Böyle bir durum için, XML dosyası olmadan nasıl yapılabilir bu işler onu araştırdım.
Aslında parçalayacağımız XML dosyasında 1 tane kayıt varsa işimiz kolay, fakat burada 1den fazla kayıt olduğu durumlarda marshalling işleminde XMLe bilgileri kaydederken hiyerarşi icabı başına ekstra tag koyarak kaydediyor. Yani şunun gibi,
<anonymous-tag>
<person>...</person>
<person>...</person>
</anonymous-tag>
Bu durumda da bu XMLi unmarshal ederken problem çıkıyor. Bunu, person listemizi ayrı bir sınıfa koyarak çözüyoruz.Yazılanlar havada kalmış olabilir, o yüzden kodlara geçelim.
Person.Java
import java.util.Date;
public class Person{
private String name = null;
private Date dob = null;
public Person() {
super();
}
public Person(String name) {
this.setName(name);
}
public Person(String name, Date dob) {
this.setName(name);
this.setDob(dob);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setDob(Date dob) {
this.dob = dob;
}
public Date getDob() {
return dob;
}
public String toString(){
return "Name: "+this.getName()+"\nDate of Birth: "+this.getDob();
}
}
PersonList.Java
public class PersonList {
public PersonList(int number) {
super();
this.person = new Person[number];
}
public PersonList() {
super();
}
private Person[] person;
public Person[] getPerson() {
return person;
}
public void setPerson(Person[] person) {
this.person = person;
}
}
Main.Java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.exolab.castor.xml.XMLContext;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException,
MappingException, MarshalException, ValidationException {
// Yeni Person objesi
Person person = new Person("Emre Gözen");
person.setDob(new Date(1999, 06, 29, 12, 20));
// Yeni Person objesi
Person person2 = new Person("Emre Gözen1234564");
person2.setDob(new Date(1999, 06, 29, 12, 20));
PersonList personList = new PersonList(2);
personList.getPerson()[0]=person;
personList.getPerson()[1]=person2;
// Marshalling için Writer objesi
FileWriter writer = new FileWriter("test.xml");
XMLContext context = new XMLContext();
// Marshaller objesi
Marshaller marshaller = context.createMarshaller();
marshaller.setWriter(writer);
marshaller.setSuppressXSIType(true);
// Marshalling işlemi
marshaller.marshal(personList);
// Unmarshalling için Reader
FileReader reader = new FileReader("test.xml");
XMLContext context2 = new XMLContext();
// Unmarshaller objesi
Unmarshaller unmarshaller =
context2.createUnmarshaller();
unmarshaller.setClass(PersonList.class);
// Unmarshalling işlemi
PersonList personList2 = (PersonList) unmarshaller.unmarshal(reader);
// Sonucu ekrana yazdırma
for (int i = 0; i < 2; i++) {
System.out.println(personList2.getPerson()[i].getName() + "\n\n");
}
}
}
Takıldığınız yer olursa beraber inceleyebiliriz. Şimdilik bu kadar.
Herkese iyi günler.
27 Temmuz 2011 Çarşamba
Castor Framework Kullanımı (XML Veri Dönüştürme)
Merhabalar,
Uzun süredir yazı yazamıyordum, bugün öğrendiğim önemli bir konuyu yazıya dökmek istedim. Bilindiği üzere, XML, veri aktarma ve depolamada kullanılabilen oldukça yararlı bir format. Bu formatı Javada nesne yönelimli programlamaya uygun olarak kullanmak için ise çeşitlli frameworkler mevcut. Bunlardan biri de Castor dur. Bu frameworkle beraber elimizde bulunan objeleri XML'e aktarıp, daha sonradan bu XML dosyasından geri objeler oluşturabileceğiz.
Castor'un resmi sayfasında hoş bir dökümantasyonu var, bu işle ilgilenecek arkadaşlara tavsiyem bunu da mutlaka okumalarıdır.
Şimdi örnek kodlarda biraz daha ayrıntıya inelim.
Projemizde iki ayrı sınıf olacak, birincisi "Person" sınıfı, kişinin ismini, işini ve favori araba markalarını tutacak, diğeri ise main fonksiyonumuzu barındıran "Main" sınıfı. Bunların yanında, projemizin çalışabilmesi için bazı jar dosyalarını projemize eklememiz gerekiyor. İsimlerini aşağıya yazıyorum, googlede aratıp indirebilirsiniz.
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdide kodlar:
Öncelikle mapping işlemimiz için gerekli olan mapping.xml
Burada oluşacak xml'in yapısına karar veriliyor.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="Person">
<map-to xml="Person" />
<field name="name" type="java.lang.String">
<bind-xml name="name" node="attribute" />
</field>
<field name="dob" type="java.util.Date">
<bind-xml name="dob" node="element" />
</field>
<field name="certificates" type="java.lang.String" collection="arraylist">
<bind-xml name="certificates" node="element" />
</field>
</class>
</mapping>
Person.java
import java.util.ArrayList;
public class Person {
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public ArrayList<String> getFavorites() {
return favorites;
}
public void setFavorites(ArrayList<String> favorites) {
this.favorites = favorites;
}
private String name;
private String job;
private ArrayList<String> favorites;
public Person(String name,String job,ArrayList<String> favorites){
this.name = name;
this.job = job;
this.favorites = favorites;
}
/**
* @return the String representation of the Person
*/
public String toString(){
return "Name: "+this.getName()+"\nJob: "+this.getJob()+"\nFavorites:"+this.getFavorites();
}
}
Main.java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
public class Main {
/**
* @param args
* @throws MappingException
* @throws IOException
* @throws ValidationException
* @throws MarshalException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MappingException, MarshalException, ValidationException {
// TODO Auto-generated method stub
ArrayList<String> favorites1 = new ArrayList<String>();
ArrayList<String> favorites2 = new ArrayList<String>();
ArrayList<String> favorites3 = new ArrayList<String>();
favorites1.add("Audi");
favorites2.add("BMW");
favorites2.add("Mercedes");
favorites3.add("VW");
favorites3.add("Ford");
favorites3.add("Audi");
ArrayList<Person> personList = new ArrayList<Person>();
personList.add(new Person("Ahmet","Engineer",favorites1));
personList.add(new Person("Mehmet","Doctor",favorites2));
personList.add(new Person("Celil","Teacher",favorites3));
// mapping.xml dosyası tanımlaması
final String MAPPING_FILE = "file:///home/gozenem/workspace/mycastor/mapping.xml";
// Mapping oluşturma
Mapping mapping = new Mapping();
mapping.loadMapping(MAPPING_FILE);
// -------- Marshalling Başlangıcı --------
// mashhal için Writer oluşturma
FileWriter writer = new FileWriter("test.xml");
// formatlama için Serializer oluşturma
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
// Marshaller oluşturma
Marshaller marshaller = new Marshaller();
marshaller.setMapping(mapping);
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
// person objesini marshalla
marshaller.marshal(personList);
// -------- Marshalling bitti --------
// -------- Unmarshalling Başlangıcı --------
// unmarshalling için reader oluşturma
ArrayList<Person> personList2 = new ArrayList<Person>();
FileReader reader = new FileReader("test.xml");
// Unmarshaller oluşturma
Unmarshaller unmarshaller = new Unmarshaller(ArrayList.class);
unmarshaller.setMapping(mapping);
personList2 = (ArrayList<Person>) unmarshaller.unmarshal(reader);
// -------- Unmarshalling Bitti --------
// Bilgileri ekrana yazdırma
for (int i = 0; i < 3; i++) {
System.out.println(personList2.get(i).toString());
}
}
}
Bu yazıdaki büyük katkısı için Murat Sayılgan arkadaşıma teşekkür ederim. Kolay gelsin.
Uzun süredir yazı yazamıyordum, bugün öğrendiğim önemli bir konuyu yazıya dökmek istedim. Bilindiği üzere, XML, veri aktarma ve depolamada kullanılabilen oldukça yararlı bir format. Bu formatı Javada nesne yönelimli programlamaya uygun olarak kullanmak için ise çeşitlli frameworkler mevcut. Bunlardan biri de Castor dur. Bu frameworkle beraber elimizde bulunan objeleri XML'e aktarıp, daha sonradan bu XML dosyasından geri objeler oluşturabileceğiz.
Castor'un resmi sayfasında hoş bir dökümantasyonu var, bu işle ilgilenecek arkadaşlara tavsiyem bunu da mutlaka okumalarıdır.
Şimdi örnek kodlarda biraz daha ayrıntıya inelim.
Projemizde iki ayrı sınıf olacak, birincisi "Person" sınıfı, kişinin ismini, işini ve favori araba markalarını tutacak, diğeri ise main fonksiyonumuzu barındıran "Main" sınıfı. Bunların yanında, projemizin çalışabilmesi için bazı jar dosyalarını projemize eklememiz gerekiyor. İsimlerini aşağıya yazıyorum, googlede aratıp indirebilirsiniz.
- castor-1.3.2-core.jar
- castor-1.3.2-xml.jar
- commons-lang-2.6.jar
- commons-logging-1.1.1.jar
- xercesImpl.jar
Şimdide kodlar:
Öncelikle mapping işlemimiz için gerekli olan mapping.xml
Burada oluşacak xml'in yapısına karar veriliyor.
mapping.xml
<?xml version="1.0"?>
<mapping>
<class name="Person">
<map-to xml="Person" />
<field name="name" type="java.lang.String">
<bind-xml name="name" node="attribute" />
</field>
<field name="dob" type="java.util.Date">
<bind-xml name="dob" node="element" />
</field>
<field name="certificates" type="java.lang.String" collection="arraylist">
<bind-xml name="certificates" node="element" />
</field>
</class>
</mapping>
Person.java
import java.util.ArrayList;
public class Person {
public Person(){}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public ArrayList<String> getFavorites() {
return favorites;
}
public void setFavorites(ArrayList<String> favorites) {
this.favorites = favorites;
}
private String name;
private String job;
private ArrayList<String> favorites;
public Person(String name,String job,ArrayList<String> favorites){
this.name = name;
this.job = job;
this.favorites = favorites;
}
/**
* @return the String representation of the Person
*/
public String toString(){
return "Name: "+this.getName()+"\nJob: "+this.getJob()+"\nFavorites:"+this.getFavorites();
}
}
Main.java
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.XMLSerializer;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
public class Main {
/**
* @param args
* @throws MappingException
* @throws IOException
* @throws ValidationException
* @throws MarshalException
*/
@SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, MappingException, MarshalException, ValidationException {
// TODO Auto-generated method stub
ArrayList<String> favorites1 = new ArrayList<String>();
ArrayList<String> favorites2 = new ArrayList<String>();
ArrayList<String> favorites3 = new ArrayList<String>();
favorites1.add("Audi");
favorites2.add("BMW");
favorites2.add("Mercedes");
favorites3.add("VW");
favorites3.add("Ford");
favorites3.add("Audi");
ArrayList<Person> personList = new ArrayList<Person>();
personList.add(new Person("Ahmet","Engineer",favorites1));
personList.add(new Person("Mehmet","Doctor",favorites2));
personList.add(new Person("Celil","Teacher",favorites3));
// mapping.xml dosyası tanımlaması
final String MAPPING_FILE = "file:///home/gozenem/workspace/mycastor/mapping.xml";
// Mapping oluşturma
Mapping mapping = new Mapping();
mapping.loadMapping(MAPPING_FILE);
// -------- Marshalling Başlangıcı --------
// mashhal için Writer oluşturma
FileWriter writer = new FileWriter("test.xml");
// formatlama için Serializer oluşturma
OutputFormat format = new OutputFormat();
format.setIndenting(true);
format.setIndent(4);
XMLSerializer serializer = new XMLSerializer(writer, format);
// Marshaller oluşturma
Marshaller marshaller = new Marshaller();
marshaller.setMapping(mapping);
marshaller.setSuppressXSIType(true);
marshaller.setWriter(writer);
marshaller.setDocumentHandler(serializer.asDocumentHandler());
// person objesini marshalla
marshaller.marshal(personList);
// -------- Marshalling bitti --------
// -------- Unmarshalling Başlangıcı --------
// unmarshalling için reader oluşturma
ArrayList<Person> personList2 = new ArrayList<Person>();
FileReader reader = new FileReader("test.xml");
// Unmarshaller oluşturma
Unmarshaller unmarshaller = new Unmarshaller(ArrayList.class);
unmarshaller.setMapping(mapping);
personList2 = (ArrayList<Person>) unmarshaller.unmarshal(reader);
// -------- Unmarshalling Bitti --------
// Bilgileri ekrana yazdırma
for (int i = 0; i < 3; i++) {
System.out.println(personList2.get(i).toString());
}
}
}
Bu yazıdaki büyük katkısı için Murat Sayılgan arkadaşıma teşekkür ederim. Kolay gelsin.
Kaydol:
Kayıtlar (Atom)