xml etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
xml etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Pazartesi, Aralık 22, 2008

XML Processing in kolay yolu -- JAXB Tutorial

Xml dosyaları ile uğraşıyorsanız, web servislerlerle işiniz çoksa bilmeniz gereken en önemli java paketi jwsdp dir. jwsdp (java web service developer pack) j2ee mimarisinde çok önemli bir yere sahiptir. bu yazımızda JWSDP nin içinde bulunan JAXB üzerinde duralım. Kısaca JAXB java developerlara xml ve xml processing işlerini detaylı olarak bilmeden xml ile kolayca çalışmasını sağlar. XML-Databinding ile xml e karşılık gelen java objeleri oluşturularak onlar üzerinde çalışılır. Böylelikle SAX, JDOM, ve DOM bilmenize gerek kalmadan xml ile işlerinizi yaparsınız. Bu sizinle xml dosyası arasına bir katman koyar. Bu katmanın xml üzerinde detaylı çalışmak isteyenler için tabiiki kısıtlayıcı özelliği var ama xml yapıları pek değişmeyen durumlar için JAXB kullanmak çok avantajlı. çünkü sizi hamallıktan kurtarır.

Bu tutorial içinde JAXB kurulumu, marshalling ve unmarshalling konuları yer alır.

JAXB SETUP
Öncelikle Java Web Services Developer Pack 2.0 ı indirmeniz gerekir. setupını çalıştırıp bitirdikten sonra C:\Sun\jwsdp*** gibi bir dizin oluşacaktır.(Tabi JDK5.0 ve üstünü kurmuş olduğunuzu varsayıyorum). Bundan sonra sistem PATH ine C:\Sun\jwsdp-2.0\jaxb\bin eklemeniz gerekir. yani JAXB nin bin klasörünü. Ayrıca JAXB_HOME değişkenini de sisteme eklemeniz gerekir. Bundan sonra komut satırına girip xjc yazdığınızda eğer tanınıyorsa kurulumunuz bitmiş demektir.


UNMARSHALLING (XML to Java Object)
şöyle bir xml dosyamız olsun;

<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</billTo>
<items>
<item partNum="242-NO">
<productName>Nosferatu - Special Edition (1929)</productName>
<quantity>5</quantity>
<USPrice>19.99</USPrice>
</item>
<item partNum="242-MU">
<productName>The Mummy (1959)</productName>
<quantity>3</quantity>
<USPrice>19.98</USPrice>
</item>
<item partNum="242-GZ">
<productName>Godzilla and Mothra: Battle for Earth/Godzilla
vs. King Ghidora</productName>
<quantity>3</quantity>
<USPrice>27.95</USPrice>
</item>
</items>
</purchaseOrder>




bu xml dosyamızı xsd ye çevirmemiz gerekiyor. xsd detayları ile uğraşmak istemiyorsanız herhangi bir xml xsd convertor ile bu işi halledebilirsiniz. bu tutorial da XMLFox kullandım.

command promptan xsd dosyanızın olduğu dizine gelin;

xjc -p org.karatas.test.po po.xsd

komutunu yazdıktan sonra size verdiğiniz path te classlarınızı oluşturur. üretilen klassları projenizde src klasörüne kopyalayın.

jaxb-api.jar, jaxb-impl.jar, jaxb-xjc.jar, activation.jar ve jsr173_api.jar liblerini de jaxb kurulum klasöründe alıp projeye lib olarak ekleyin veya projede external olarak onları referans gösterin.


şimdi asıl işimize geldik. unmarshall yapan kod bloğumuz şöyle olabilir;

JAXBContext jc = JAXBContext.newInstance("org.karatas.test.po");
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po=(PurchaseOrder)u.unmarshal(new File("D:\\workarea\\po.xml"));

System.out.println("============shipto==========");
List stlist = po.getShipTo();
for (Iterator iterator = stlist.iterator(); iterator
.hasNext();) {
ShipTo shipTo = (ShipTo) iterator.next();
System.out.println("Name=" + shipTo.getName());
System.out.println("street=" + shipTo.getStreet());
System.out.println("city=" + shipTo.getCity());
System.out.println("state=" + shipTo.getState());
System.out.println("zip=" + shipTo.getZip());
System.out.println("country=" + shipTo.getCountry());
}


gördüğünüz gibi xml dosyasını çok kolay bir şekilde java objelerinden okuduk. unmarshal paketinin classları ve detaylı kullanımı için adresine bakabilirsiniz.


MARSHALLING (Java Object to XML)
şimdi marshalling işini yapan kodumuzu aşağıya alalım.


JAXBContext jc = JAXBContext.newInstance("org.karatas.test.po");
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

ObjectFactory of = new ObjectFactory();
PurchaseOrder po = of.createPurchaseOrder();

po.setOrderDate(new Date().toString());

ShipTo shipto = of.createPurchaseOrderShipTo();
shipto.setCity("NewYork");
shipto.setCountry("US");
shipto.setName("Muhammet Simsek");
shipto.setState("NY");
shipto.setStreet("265 Garden Street");
shipto.setZip("12530");
po.getShipTo().add(shipto);

Items items=of.createPurchaseOrderItems();

Item item = of.createPurchaseOrderItemsItem();
item.setPartNum("NY-567");
item.setProductName("The GodFather");
item.setQuantity("5");
item.setUSPrice("35.25");
items.getItem().add(item);

po.getItems().add(items);
m.marshal(po, new FileWriter(new File("D:\\workarea\\po22.xml")))


marshal olayı için gene yukarıdaki projemiz üzerinde çalışalım.
Dikkat edecek olursanız hep JAXBContext objesini kullanıyoruz. Bununla çalışacağımız contexi veriyoruz. Ondan sonra ya Unmarshaller ya da Marshaller objelerini kullanıyoruz. Dolayısıyla xml ile çalışmak için çok fazla şey öğrenmeye gerek yok.

Gördüğnüz üzre xsd de verdiğimiz yapının istediğimiz tarafını doldurup istediğimiz tarafını boş bırakabiliriz.

bu tutorial ın dosyaları için lütfen tıklayınız.
Projeyi çalıştırma konusunda sıkıntı yaşarsanız bana yazabilirsiniz.


Konu ile ilgili detaylı bilgi için http://java.sun.com/webservices/docs/1.6/tutorial/doc

Herkese iyi çalışmalar...

Pazartesi, Kasım 03, 2008

xmlbeans ile xml parse etme

bugünkü yazımızda xmlbeans ile daha kolay xml parsetme yöntemine bakalım.

xmlbeans sizin için sizin xml yapınıza uygun java objeleri oluşturur. bunu yaptıktan sonra sizin yapmanız gereken o objelerin değerlerini almanız veya onlara değer atmanız.

öncelikle xmlbeans i indirmeniz gerekecek. indirdikten sonra dosyayı extract etmeniz gerekiyor. extract edilen klasörün içindeki bin klasörünü sistem pathinize ekleyin. bunu yaptıktan sonra command prompptan scomp yazdığınızda komut tanınmış olacak. böyleylikle xmlbeans imiz kuruldu.

bundan sonra artık işe başlıycaz. birinci işimiz parse edeceğimiz xml file ı xml schema(xsd) ya çevirmek. bunun için bir dizi uygulama ve online tool var. her zaman elinizin altında olması açısından online bir toolu tercih edebilirsiniz. xmlinizi şu adreste xsd ye çevirdikten sonra çok işimiz kalmıyor.

command prompta girelim. scomp yazıp entera bastıktan sonra seçenekleri göreceksiniz . Aşağıdaki şekli ile basitçe işimizi görebiliriz;

scomp -out note.jar note.xsd

config.xsdconfig adında bir dosya oluşturarak package yapınızı verebilirsiniz.

Bu dosyayı da tanıdıktan sonra komut yapımızı şu şekilde düzenleyebiliriz;

scomp -out note.jar note.xsd config.xsdconfig

buarada xsd dosyanız ve config dosyanız bulunduğunuz dizinde olmalı bunu unutmayalım.

şimdi de xmlimizi okuyalım;

File file=new File("D:\\workarea\\note.xml");
NoteDocument notedoc=NoteDocument.Factory.parse(file);
NoteDocument.Note note=notedoc.getNote();
System.out.println("note from:"+note.getFrom());


Önemli Not: xmlinizi xsdye çevirirken veya çevirdikten sonra okurken zorlukla karşılaşırsanız. xsd schemanızı kontrol edin. zira xsd oluşturduğunuz xml yapınız farklı olabilir. o yüzden gerekirse manuel olarak xsd de değişklik yapabilirsiniz. birde xbean.jar ve jsr***.jar liblerini proje pathine eklemeyi unutmayalım.

görüşmek üzere...