XML Ahmet Demirelli Sabancı Üniversitesi 2007 Konular XML XSL DTD XML Schema ( XSD ) İşaretleme Dili (Markup Language) Nedir ? Ne amaçla kullanılabilir ? Etiket (Tag) nedir ? Bildiğimiz işaretleme dilleri neler ? HTML Hyper Text Markup Language En çok bilinen işaretleme dili Düz yazıyı, etiketler yardımıyla daha güzel görüntülenmesini sağlar Önceden tanımlamış etiketler kullanır Browserlar tarafından yorumlanır Neden XML ihtiyacı Veritabanlarındaki verilerin paylaşılması Veri tabanındaki bilgilerin dosyalarda saklanması Özellikle B2B uygulamalarda verilerin paylaşımı Genel veri formatlama sorunu Çözüm – XML Neden XML e ihtiyacımız var bir örnekle görelim Örnek (Veri paylaşımı - B2B) B şirketi Dublin A şirketi İstanbul Application Application (WepApp,Web (WepApp,Web Service Service veya veya Network Network app) app) •Veriyi çek •Formatla *çok önemli Application Application •Veriyi oku •Parse et* •Veri tabanına yaz •Gönder Veriyi neden formatlıyoruz Veriyi neden parse ediyoruz Örnek (Veri paylaşımı - B2B) B şirketi Dublin A şirketi İstanbul 110 : Ahmet : Demirelli \n 111 : Hakan : Inan \n 110 : Ahmet : Demirelli \n 111 : Hakan : Inan \n ... Fromatla .... ve Gönder Parse et ve Veritabanına yaz No Ad Soyad ID Lastname Name 110 Ahmet Demirelli 110 Demirelli Ahmet 111 Hakan Inan 111 Inan Hakan Örnek Yorumları Bu iki şirket başka şirketlerle veri paylaşıyorsa “:” ve “\n” yerine başka ayıraçlar kullanılıyorsa Veriler tüm dünyaya açılacaksa Çözüm Tüm dünya tarafından kabul edilmiş ve herkesin kolayca anlayabileceği bir veri formatlama standardı kullanmamız gerekecek XML XML eXtensible Markup Language Bir işaretleme dili Genişletilebilir * Verilerin taşınması veya dosyalarda saklanması için kullanılır Bütün programlama dillerinin XML desteği var Tüm veritabanlarının XML desteği var *Önceden tanımlanmış etiketler kullanmak yerine kendi etiketlerimizi kullanırız Örnek XML dökümanı calisanlar tablosu No Ad Soyad 110 Ahmet Demirelli 111 Hakan Inan <?xml version="1.0"> <calisanlar> <kisi> <no>110</no> <ad>Ahmet</ad> <soyad>Demirelli</soyad> </kisi> <kisi> <no>111</no> <ad>Hakan</ad> <soyad>Inan</soyad> </kisi> </calisanlar> HTML vs XML HTML verinin nasıl görüneceğini belirler XML verinin ne verisi olduğunu belirler HTML <i>Bill</i> <u>Lawrence</u> XML <aktor> <isim>Zach</isim> <soyisim>Braff</soyisim> </aktor> “Element” ler ve “Attribute” lar Element – – <firmaismi>Sun</firmaismi> <firmaismi/> (boş element) Attribute – <calisan id=“9786”>Ahmet</calisan> XML yazım kuralları Bir XML dökümanında; Sadece bir tane root “element” olmalıdır Etiket ve atribute isimleri “case sensitive” dir Bütün elementlerin mutlaka kapanış etiketi olmalıdır Elementler kesişmemelidir “Attribute” lar mutlaka tırnak işareti içinde olmalıdır Bu kurallara uygun yazılmış XML dökümanlarına “well formed” denir. eXtensible Stylesheet Language XSL XSL XSL(eXtensible Stlysheet Language) XML dökümanının görünümünün nasıl olması gerektiğini tanımlayan bir dildir. Üç bileşenden oluşur; – – – XSLT – XML dökümanını dönüştürme dili XPath – XML dökümanı içerisinde arama dili XSL-FO – XML dökümanı formatlama dili XSL XSLT ( XSL Transformations ) – Xpath i kullanarak XML dökümanını başka bir dökümana dönüştürmek için kullanılır (Ör: html) XPath – XML dökümanı içerisinde istediğimiz özellikteki element veya attribute ulaşmamızı sağlayan dildir. (SQL e benzer ) XSLT Örnekleri Basit bir XSL yazmak XML ve XSL birleşiminden HTML çıktı almak. XML dökümanına aşağıdaki satırı ekliyoruz <?xml-stylesheet type="text/xsl" href=“siparis.xsl"?> <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h2>Order List</h2> <table border="1"> <tr bgcolor="#9acd32"> <th align="left">Count</th> <th align="left">Brand</th> <th align="left">Model</th> </tr> XSLT XPath <xsl:for-each select=“siparisler/siparis"> <tr> <td> <xsl:value-of select=“adet"/> </td> <td> <xsl:value-of select=“marka"/> </td> <td> <xsl:value-of select=“model"/> </td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Document Type Definition DTD Problem XML dökümanında hangi element etiketleri olacak ? Bu bilgiyi diğer şirketlerlere nasıl bildireceğiz paylaşacağız ? ÇÖZÜM DTD (Document Type Definition) veya XSD (XML Schema Definition) DTD XML dökümanındaki “element” lerin ve “attribute” ların hangi özelliklerde* olması gerektiği belirtilen dosya. *(Element isimleri neler olmalı, kaç defa tekrar etmeli, bir elementin alt elementleri neler olmalı, attribute ları neler olmalı ...vs ) DTD de belirtilen kurallara uygun yazılmış XMLdökümanlarına Valid (onaylanmış) döküman denilir. XML (Well-Formed -- Valid) -Well Formed– yazım kurallarına uygun -Valid– – Yazım kurallarına uygun DTD de belirtilmiş kurallara uygun Örnek DTD <!ELEMENT siparisler (siparis)+> <!ELEMENT siparis (adet, marka,model)> <!ELEMENT adet (#PCDATA)> <!ELEMENT marka (#PCDATA)> <!ELEMENT model (#PCDATA)> DTD bildirimleri (Declarations) <! ELEMENT <! ATTLIST Bir element tipinin alabileceği attribute larının bildirimidir. <! ENTITY Bir XML elementi bildirimidir Belli bir içeriğin bir isme bağlanarak o isimle ilişkilendirilmesini sağlar. <! NOTATION XML dökümanı haricinde bir veri tipi tanımlamak için kullanılır <! ELEMENT <! ELEMENT elementadı içerikTipi> (diğer element isimleri) -- ismi yazılan elementleri içerir EMPTY – Boş element ANY – Herhengi bir element veya veri içerir (#PCDATA) – Karakter veri içerir Semboller ( ElementAdı ) – Element sadece bir kere tekrar etmeli ElementAdı ? – Element bir kere veya hiç tekrar etmeyebilir ElementAdı + -- Element 1 veya daha fazla tekrar etmeli ElementAdı * -- Element 0 veya daha fazla tekrar etmeli Element1, Element2 – Element2 , Element1 den sonra gelmeli ( Element1 | Element2 ) – Element1 veya Element2 den bir tanesi olmalı <! ATTLIST <! ATTLIST elementAdı attributeAdı attributeTipi defaultDeğeri> #REQUIRED – attribute her zaman olmalıdır #IMPLIED – attribute zorunlu değildir #FIXED değer– attribute değeri sabit değeri alabilir (eğer element içerisinde attribute kullanılmazsa bu değer alınır) değer – attribute, element içerisinde kullanılmamış ise orada yazılı değeri tanımlanmamış ise default değeri alır <! ATTLSIT urun urunKodu CDATA #REQUIRED > Örnekler DTD ve ona uygun yazılmış DTD örneği. Basit bir DTD yazmak DTD amaç ve eksiklikleri DTD nin kullanım amaçları ; XML dökümanın yazılım kurallarını belirlemek ve bunu diğer kişilerle/kurumlarla paylaşmak XML dosyasını kullanmadan önce onaylamak(Validation) Bazı element veya attribute lar için default değerler atamak DTD nin eksiklikleri; Çok sınırlı veritipi (datatype) desteği Veri tabanlarında kullanılan veri tiplerini desteklememesi XML yazım kurallarına uygun olmaması (non-XML Format) XML Schema Definitions XSD XML Schema (XSD) DTD nin eksikliklerini gidermek için geliştrildi Dosya uzantısı .xsd dir Root element <schema> XML yazım kurallarına uygun yazılmalıdır Simple ve Complex elementler “Simple” element bir değer dışında hiçbir şey içermeyen elementdir. – – – Attribute içermez Başka elementler içermez Boş olamaz Eğer bir element “simple” değil is “complex” tir. – – – Attribute ları olabilir Boş olabilir Başka elementler veya text içerebilir ya da her ikisini aynı anda da içereblir Simple ve complex elementler <musteri> complex element <adres> <sokak>5. Sokak</sokak> <şehir>İstanbul</şehir> <ülke>Türkiye</ülke> </adres> </musteri> simple element Simple element tanımı Simple element tanımı ; <xs:element name=“elementAdı" type=“tip" /> Burada: – – name elementin ismi Ençok kullandığımız element tipleri (type) xs:boolean xs:integer xs:date xs:string xs:decimal xs:time Simple elementin alabileceği attribute ler: – – default="default value“ değer verilmezse alacağı değer fixed="value“ başka bir değer almasını istemiyorsak Attribute tanımı Attribute lar simple elementler gibi tanımlanır Bir attribute tanımı; <xs:attribute name="name" type="type" /> – name ve type element tanımındaki gibidir Attibute tanımıda bulunabilecek diğer attribute lar: – – – – default="default value" değer verilmezse alacağı değer fixed="value" başka bir değer almasını istemiyorsak use="optional" attribute kullanmak zorunlu değil ise (default) use="required" attribute kullanmak zorunlu ise Kısıtlamalar Eğer element veya attribute ların alacağı değerleri kısıtlamak istersek: – <xs:element name=“ad"> <xs:restriction base=“tip"> ... kısıtlamalar ... </xs:restriction> </xs:element> (veya xs:attribute) For example: – <xs:element name=“yaş"> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"> <xs:maxInclusive value="140"> </xs:restriction> </xs:element> Sayısal kısıtlamalar minInclusive – alabileceği değer ≥ value minExclusive – alabileceği değer > value maxInclusive -- alabileceği değer ≤ value maxExclusive -- alabileceği değer < value totalDigits -- değer value basamaklı olmalı fractionDigits -- alabileceği değerdeki ondalık bölüm value basamaklı olmalı String (kelime) kısıtlamaları length -- kelime value harfli olmalı minLength -- kelime en az value harfli olmalı maxLength -- kelime en fazla value harfli olmalı pattern -- value regular expression whiteSpace – whitespace karakterlerini ne yapması gerektiği – value="preserve" kalsın – value="replace" whitespace leri boşluk ile değiştir – value="collapse" Tekrar eden whitespace karakterleri tek bir boşluk haline getir Enumeration (Liste kısıtlaması) Elementin alabileceği değişkenleri liste halinde belirler Example: – <xs:element name=“mevsim"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value=“Yaz"/> <xs:enumeration value=“Kış"/> <xs:enumeration value=“Sonbahar"/> <xs:enumeration value=“İlkbahar"/> </xs:restriction> </xs:simpleType> </xs:element> Complex element ler Bir complex (karmaşık) tip tanımlanırken <xs:element name=“adı"> <xs:complexType> ... Complex tip ile ilgili bilgiler... </xs:complexType> </xs:element> Örnek: <xs:element name=“kişi"> <xs:complexType> <xs:sequence> <xs:element name=“adı" type="xs:string" /> <xs:element name=“soyadı" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:sequence> elementler bu sırayla yazılmalı Global ve local tanımlar <xs:schema> etiketinin hemen altına tanımlanan “top level” elementler şemanın heryerinde geçerlidir (global) <xs:complexType> aetiketinin içerisinde tanımlanan elementler sadece o kompleks tip için geçerlidirler (local) Örnek: <xs:element name=“kişi"> <xs:complexType> <xs:sequence> <xs:element name=“ad" type="xs:string" /> Local elements <xs:element name=“soyad" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:schema> altında “top level” tanımlanan elementlerin sırası önemli değildir Complex element kullanımı Tanımlamış olduğumuz bir complex element i artık normal bir tip gibi type="...“ attribute ları içerisinde kullanabiliriz – örnek: – <xs:element name=“öğrenci" type=“kisi"/> <xs:element name=“öğretmen" type=“kisi"/> Bir elemente ait local tipleri başka bir element içerisinde kullanamayız <xs:sequence Bir complex tip içerisindeki elementlerin sırasını ve isimlerini belirtmek için kullanırız: <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:all <xs:all elementleri herhangi bir sıralanması kısıtlamaz <xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstName" type="xs:string" /> <xs:element name="lastName" type="xs:string" /> </xs:all> </xs:complexType> </xs:element> <xs:all grup elementleri 1 veya hiç tekrar etmeyebilir Eğer tekrar kısıtlaması yapmak istersek minOccurs="n" ve maxOccurs="n" kullanabiliriz(default değer 1 dir) – Yukarıdaki örnekte <xs:all elementleri 0 veya 1 defa tekrar edebilir Attribute`u olan Elementler Eğer bir elementin attributeları varsa artık o element simple type değildir. – – <xs:element name="population"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="year" type="xs:integer"> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> Boş element ler Boş elementler “complex” tir. ☺ <xs:complexType name="counter"> <xs:complexContent> <xs:extension base="xs:anyType"/> <xs:attribute name="count" type="xs:integer"/> </xs:complexContent> </xs:complexType> Extensions BiR complex tip tanımlarken başka bir complex tip baz alınabilir.(inheritance ?) <xs:complexType name="newType"> <xs:complexContent> <xs:extension base="otherType"> ...new stuff... </xs:extension> </xs:complexContent> </xs:complexType> string tipleri Bir string tipi olarak aşğıdakileri kullanabiliriz: – – – xs:string – herhangi bir string xs:normalizedString – “tab”, yeni satır ve satır başı karakterleri içermeyen string xs:token – tek boşluk karakteri haric hiç bir whitespace karakteri içermeyen string Stringlere uygulanabilecek kısıtlamalar: – enumeration, length, maxLength, minLength, pattern, whiteSpace date ve time tipleri xs:date -- CCYY-MM-DD, şeklindeki tarih formatı, örnek: 2002-11-05 xs:time -- hh:mm:ss şeklindeki zaman formatı (saat, dakika, saniye) xs:dateTime -- CCYY-MM-DDThh:mm:ss birleştirilmiş tarih ve zaman formatı date ve time tiplerinde kullanılabilecek kısıtlamalar: – enumeration, minInclusive, maxExclusive, maxInclusive, maxExclusive, pattern, whiteSpace Sayısal (numeric) tipler Sayısal ifadelerde aşağıdaki tipler kullanılabilir: xs:decimal xs:positiveInteger xs:byte xs:negativeInteger xs:short xs:nonPositiveInteger xs:int xs:nonNegativeInteger xs:long Sayısal ifadelerdeki kısıtlamalar: – enumeration, minInclusive, maxExclusive, maxInclusive, maxExclusive, fractionDigits, totalDigits, pattern, whiteSpace Örnekler XSD ve ona uygun yazılmış XML örneği Eclipse te XSD yazmak. XML e uygun şema üretmek. Validate etmek. ....vs ahmetdemirelli@sabanciuniv.edu