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:




Hiç yorum yok:

Yorum Gönder