Menu

28 Ağustos 2009 Cuma

XML

Convert XML to XSD
http://www.flame-ware.com/products/xml-2-xsd/default.aspx

XML, XSLT, XSD, JAXB
Bu tutorial da XML hakkında gerekli temel bilgiler verildikten sonra Eclipse de örnek uygulamalar yapılacaktır.

XML Nedir? (Kaynak: İnternet )

XML=eXtensibe Markup Language kelimelerinin baş harflerinden oluşan HTML gibi Markup Language (yani <> tagları kullananılarak hazırlanan ) bir Web programlama ve bilgi transformasyonuna - (uygulamalar ya da sistemler arasında bilgi aktarımı) yarayan bir dildir.

XML verileri(data) tanımlamak için dizayn edilmiştir.

XML tagları HTML deki gibi önceden tanımlanmamıştır. Bu tagları programcı oluşturur. (Örneğin HTML'de <p>(paragraf),<table>(tablo) gibi taglar vardır. Bunlar Browser'ların (örneğin IE) otomatik olarak tanıyabildiği taglardır. Fakat XML de bu tagları kendimiz oluşturuyoruz ve Browser'a tanıtmak (görüntülemek) için XSLT(eXtensible Stylesheet Language) dilini kullanıyoruz.

XSLT Tutorial:

XML verileri tanımlamak için DTD(Document Type Definition) veya XML Schema kullanır.

Örnek olarak aşağıda invoice(fatura) dokümanı olarak kullanılabilecek xml dokümanı var. Burada fatura da yer alan her bir kalem mal/ürün tanımlanmış. Ayrıca faturadaki para birimi ve faturanın ödeme tarihini (due) tanımlanmış.

<?xml version="1.0" encoding="UTF-8"?>
<invoice due="2000-09-22">
<product>
<name>Apple</name>
<price>0.10</price>
</product>
<product>
<name>Orange</name>
<price>0.08</price>
</product>
<product>
<name>Strawberries</name>
<price>0.20</price>
</product>
<product>
<name>Banana</name>
<price>0.14</price>
</product>
<total currency="US$">0.52</total>
</invoice>

XMLSPY isminde xml dokümanları oluşturmak ve xml dokümanları üzerinde çalışmak için güzel bir yazılım var.


XMLSPY indirip kurduktan sonra File – New –XML Document şeklinde bir xml dokümanı oluşturalım. Sonra içine yukarıdaki fatura xml dokümanını kopyalayalım ve deneme.xml olarak kayıt edelim. Sonra Menüde DTD/Schema dan Generate DTD/Schema seçip xml şemasını da oluşturabiliriz. deneme.xsd olarak kayıt edelim. İçeriğini notepad de görüntülediğimizde:

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by aa (ORiON) -->
<!--W3C Schema generated by XMLSPY v2004 rel. 4 U (http://www.xmlspy.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="invoice">
<xs:complexType>
<xs:sequence>
<xs:element ref="product" maxOccurs="unbounded"/>
<xs:element ref="total"/>
</xs:sequence>
<xs:attribute name="due" type="xs:date" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Apple"/>
<xs:enumeration value="Banana"/>
<xs:enumeration value="Orange"/>
<xs:enumeration value="Strawberries"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="price">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:enumeration value="0.08"/>
<xs:enumeration value="0.10"/>
<xs:enumeration value="0.14"/>
<xs:enumeration value="0.20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="product">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="price"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="total">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="currency" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>

Bu şemayı kullanacak xml dosyası da aşağıdaki şekilde olacaktır.

<?xml version="1.0" encoding="UTF-8"?>
<invoice due="2000-09-22" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:xmldeneme.xsd">
<product>
<name>Apple</name>
<price>0.10</price>
</product>
<product>
<name>Orange</name>
<price>0.08</price>
</product>
<product>
<name>Strawberries</name>
<price>0.20</price>
</product>
<product>
<name>Banana</name>
<price>0.14</price>
</product>
<total currency="US$">0.52</total>
</invoice>

http://www.netbeans.org/ den NetBeans IDE yi indirip herhangi bir proje oluşturduktan sonra xml ve xsd dosyalarımızı açabiliriz. deneme.xsd dosyası tab dan Design tıklandığında aşağıdaki şekilde gösterilmektedir.



Şimdi de fatura dokümanın görüntüsünü tasarlayalım. Faturanın aşağıdaki şekilde görüntülenmesini istiyoruz.


Fatura Bilgileri
Fatura Ödeme Tarihi:

Frame1
Toplam:
Fatura Kur:



Bu fatura dokümanı için XSL dosyasını oluşturmak için NetBeans de ya da XMLSpy da File – New -> XSL şeklinde deneme.xsl oluşturalım. Bu dosyada

Fatura Ödeme Tarihi, Fatura Kur ve Toplam için <xsl:value-of> ini kullanacağız. Detay için bakınız:

Tablo şeklindeki Ürün ve Fiyat için ise <xsl:for-each> elementini kullanacağız. Detay için bakınız:

Fatura Ödeme Tarihi ve Fatura Kur attribute olduğu için @ kullanılarak değerine erişebiliyoruz.


<?xml version="1.0" encoding="UTF-8"?>
<!--
Document : deneme.xsl
Created on : 26 Mart 2008 Çarşamba, 11:54
Author : byazar
Description:
Purpose of transformation follows.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<!-- TODO customize transformation rules
syntax recommendation http://www.w3.org/TR/xslt
-->
<xsl:template match="/">

<html>
<head>
<title>deneme.xsl</title>
</head>
<body>
<H1>Fatura Bilgileri</H1>
<br> Fatura Ödeme Tarihi:
<xsl:value-of select="invoice/@due" />
</br>
<table border="1">
<tr bgcolor="#9acd32">
<th>Ürün</th>
<th>Fiyat</th>
</tr>
<xsl:for-each select="invoice/product">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
</table>
<br> Toplam:<xsl:value-of select="invoice/total"/> </br>
<br> Fatura Kur:<xsl:value-of select="invoice/total/@currency"/> </br>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


XSL Transformation xml dosyasının xsl dosyası kullanılarak görüntülenmesidir diyebiliriz. Dolayısıyla input olarak deneme.xml kullanılacak, transformasyon sırasında ise deneme.xsl kullanarak html, xml, pdf output formatına dönüştürülebilir.

XSL Transformation XMLSPY ile yapabilmek için menüden XSL -> XSL Transformation tıklayarak ve input dosya olarak deneme.xml i seçerek aşağıdaki şekilde dönüştürüyoruz:


NetBeans de dosya üzerinde sağ tuş ile XSL Transformation seçerek aşağıdaki ekranda OK tıkladıktan sonra Browser da dönüştürelen dosyayı (html) görebiliriz.






JAXB
Şimdi işin biraz da kodlama tarafına bakalım;

JAXB API kullanarak XML dokümanlarına kolay bir şekilde erişebiliriz. JAXB dışında da kullanılan librariler mevcut :SAX, DOM, JDOM, and dom4j. Bu API ler dokümanın yapısıyla çok fazla uğraşmak gerektiğinde kullanılması gerekiyor. XML doküman yapısı konusunda uğraşmamız gerekmiyorsa yani xml dokümanindaki verileri okuyup kullanacaksak sadece, bu durumda JAXB kullanmak daha uygun olur.


Yukarıdaki şekilde görüldüğü gibi uygulama xml dokümanını unmarshal ile object e dönüştürecek.

c:\xmldeneme dizini altına deneme.xsd ve deneme.xml i kopyalayalım:

ve aşağıdaki şekilde xjc -p com.ibm.dw deneme.xsd çalıştıralım. Aşağıdaki şekilde dosyaları com.ibm.dw dizini altına oluşacaktır.



Şimdi Eclipse açalım ve File –New- Java Project seçerek XMLProject isminde bir proje oluşturalım. Src de sağ tuş ile File – New -> Java Class dan JAXBDeneme isimli sınıfı com.ibm.dw.main de oluşturalım.


Sürükle bırak ile Eclipse com.ibm.dw daki class ları src dizini altına kopyalayalım.


Şimdi de JAXBDeneme.java dosyasının içeriğini aşağıdaki şekilde değiştirelim:

package com.ibm.dw.main;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;

import com.ibm.dw.*;
import java.io.FileInputStream;


public class JAXBDeneme {

/**
* @param args
*/
public static void main (String args[]) {
try {
String xmlfile = "c:/xmldeneme/deneme.xml";

;
Unmarshaller unmarshaller =null;
Invoice invoice= null;
try {
JAXBContext jaxbContext= JAXBContext.newInstance(new Class[] {com.ibm.dw.Invoice.class});
unmarshaller = jaxbContext.createUnmarshaller();
invoice =(Invoice)
unmarshaller.unmarshal(new FileInputStream(xmlfile));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Fatura Bilgileri") ;
System.out.println("Fatura Tarihi: " + invoice.getDue().toXMLFormat()) ;
System.out.println("Fatura Kur: " + invoice.getTotal().getCurrency()) ;
System.out.println("Fatura Toplam: " + invoice.getTotal().getValue()) ;
System.out.println("Ürünler") ;
for (int i=0;i<invoice.getProduct().size();i++)
{
Product product=invoice.getProduct().get(i);
System.out.println("Ürün Adı: " + product.getName()) ;
System.out.println("Ürün Fiyat: " + product.getPrice().toString()) ;
}
}catch (Exception e ) {
e.printStackTrace();
}
}
}


Şimdi de JAXBDeneme.java dosyasını Run as – Java Application olarak çalıştıralım. Console da output aşağıdaki şekilde olacaktır.




XML ve Veritabanı

XML veri içerdiğinden dolayı veritabanlarında bu verinin XML olarak depolanması gerekebilir. Bu konuda bakınız:




26 Ağustos 2009 Çarşamba

Java Message Service

Merhaba.. Bu yazimizda jms`den bahsedecegiz, ve daha kolay anlasilmasi icin orneklerle, ornek uygulamalar kullanarak anlatmaya calisacam..
JMS
JMS bir interfaceler ve ilgili semantikler kumesidir. Bu semantikler bir JMS istemcisinin kurumsal mesajlasma urunlerinin avantajlarindan nasil yararlanacaginin tanimidir. JMS java programlari icin kurumsal mesajlasma sistemi iletilerinin olusturulmasi, gonderilmesi, alinmasi ve okunmasia iliskin ortak bir yol saglar.
Mesajlasma servisi icindeki applicationlarin bilesenleri, birbirleriyle dogrudan iletisim kurmak yerine, iletilerinin bir ileti sunucusuna gonderirler.Ileti sunucusu sirasiyla iletileri alicilarina ulastirir. Bu gereksiz bir yazilim katmani gibi gorunsede buyuk avantajlar saglamaktadir. Bu gunluk hayattaki posta servisine cok benzer. Biz mektuplarimizi istedigimiz yerlere ulastirabiliriz ama, bunu bizim yerimize baskalarinin yapmasi hayatimizi cok kolaylastirir. JMS`de applicationlarimiza bir katman daha ekler ama istemci ve sunucu taraflarinin her ikisinin de yukunu hafifletir.

JMS UYGULAMA GELIŞTIRME ARAYUZUNUN BELIRLI AMAÇLARI
-JMS arayuzunun anahtar amaclarindan biri kurumsal mesajlasma olanaklarini birlestirmek ve java programcilarinin kurumsal mesajlasmayi kullanabilmesi icin ogrenmesi gerekenleri minimize etmektir.
-Hali hazirda JMS kullanmaya uygulamalarin ileti formatina uygun ileti olusturmaya elverisli arayuzler sunmak.
-Farkli isletim sistemleri, mimarileri, platformlar ve diller barindian heterojen uygulamarin gelisimini desteklemek.
-Network uzerinde kullanilmak uzere siranlanmis java nesneleri iceren iletileri desteklemek.
-XML sayfalri iceren iletileri desteklemek.

JMS NIN AVANTAJLARI
-JMS bilesen mimarisi programcilara ileti mekanizmalarindan bagimsiz yazilim urunleri gelistirme imkanlari saglar. Uygulama kaynaklarinin etkili kullanimini saglar. Bu bilesenlerin yeninden kullanabilirligini arttirir ve uygulama gelistirme zamanini azaltir.
- Bircok bilgi teknolojisi sitemi(IT Systems) kisa zaman agir modifikasyonlara ihtiyac duyar. Bu modifikasyonlar hem istemci hem de sunucu mimarisinde degisikliklere yol acar. Bu sorun JMS ile biraz da olsa hafifletilir. Cunku JMS ileti mekanizmasi uygulamadan bagimsiz oldugu icin, sistemdeki degisikliklerinden etkilenmez.
- Bir cok kurumsal uygulama degisik platformlar uzerinde dagitik olarak calismaktadir. Bu heterijen platformlar degisik turlerde ileti gonderebilir ve alabilirler. JMS saf java ile yazilmistir ve bilesenler JMS ileti mimarisini anladiklari surece bilesenlerin platform ve gelistirdikleri dil ne olursa olsun sorun cikmaz.
- Ileti servisi haberlesme kalistesinden sorumli oldugu icin uygulama bilesenleri bu konularla ugrasmaktan kurtarir.
-JMS iletileri istemcilere ulastirma ve kuyruklama islerinden sorumlu oldugu icin sunuculara daha fazla bilgi isleme olanagi saglar.