eXtensible Markup Language
Transkript
eXtensible Markup Language
eXtensible Markup Language 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. XML Teknolojileri Yusuf Kenan YILMAZ v1.2 - Draft Mayıs, 2008 XML Tanımlar ............................................................................................................................... 2 XML (eXtensible Markup Language ) ...................................................................................................2 Tarihçe ...........................................................................................................................................2 Well-formed XML..............................................................................................................................2 Valid XML ........................................................................................................................................2 Well-Formed XML ......................................................................................................................... 3 Lab : Well-Formed XML Dosyası .........................................................................................................3 DTD ve Valid XML ......................................................................................................................... 5 DTD ve Valid XML.............................................................................................................................5 Lab 1: Valid XML ve External DTD ......................................................................................................5 Lab 2: DTD Kuralları .........................................................................................................................6 Transition Graph ..............................................................................................................................8 Mixed Content Type..........................................................................................................................8 Regular Expression Örnekleri .............................................................................................................8 DTD ve XML Schema’da Unordered Sequence ......................................................................................9 Internal DTD ...................................................................................................................................9 XML NameSpace......................................................................................................................... 11 XML Schema............................................................................................................................... 13 XML Schema Simple Types ..............................................................................................................13 Tanımlar .......................................................................................................................................13 Lab 1: XML Schema........................................................................................................................13 XPath ......................................................................................................................................... 19 XSL StyleSheet ve XSLT.............................................................................................................. 22 Basit Bir Örnek ..............................................................................................................................22 XSL ..............................................................................................................................................22 XSL StyleSheet ve XSLT - 2 ........................................................................................................ 25 XQuery ....................................................................................................................................... 27 Java ile XML Parsing................................................................................................................... 30 Java ile XSLT - XML Transformasyonu ....................................................................................... 33 Ek- RAD’da XML.......................................................................................................................... 34 2 1. XML Tanımlar XML (eXtensible Markup Language ) Amaç: data ve presentasyonun (design) ayrılması Tarihçe Kökeni Standard Generalized Markup Language (SGML) ‘ye dayanır. 1996’da W3C tarafından duyurulmuştur. Well-formed XML Bir dökümanın XML olması için well-formed olması gerekir. XML Parser bu kontrolü yapar. Well-formed olması için bir kaç kuralın sağlanması gerekir. Aşağıda kurallardan bazıları verilmiştir. XML case sensitive'dir. <firstname> ile <Firstname> farklı tag'lardır. XML tag'larda örnekteki gibi mutlaka başlangıç ve bitiş tagı olmalıdır: <firstname> </firstname> Body (gövdesi) olmayan tag'lar kendi kendini kapatabilir: <firstname value=”Bob” /> Açılan bir tag mutlaka kapanmalıdır. Eğer body yoksa tag kendi kendini kapatabilir: <firstname>Joanne</firstname> <firstname/> Doğru iç içe kullanım: Açılan bir tag açıldığı sırayla kapanmalıdır. Doğru: <fullname> <firstname>Joanne</firstname> <lastname>Rodriguez</lastname> </fullname> Yanlış: <firstname>Joanne <lastname>Rodriguez</lastname> </firstname> Not: Başlangıç ve bitiş tag'ı ile aradaki data bir element adını alır. Valid XML Gramere uyan XML dökümanı validdir. Gramer DTD ya da XML Schema ile tanımlanır. Her XML dökümanı valid değildir. Parser grameri verilen XML dökümanını validate eder. Sibnet XML Eğitimi Lab Çalışması 3 2. Well-Formed XML Lab : Well-Formed XML Dosyası 1. Notepad ile books.xml dosyasına aşağıdaki içeriği yazınız. 2. Dosyası yazdıktan sonra Internet Explorer ile test edin. 3. Tag'lardan birini büyük harf ile başlatım IE ile test edin. Nasıl bir hata alıyorsunuz? 4. Hata almadan IE, XML dosyasının içeriğini veriyorsa elinizde well-formed bir XML var demektir. <?xml version="1.0" encoding="iso-8859-9"?> <booklist> <book> <booktitle>The Art of Shakespeare's Sonnets</booktitle> <bookauthor>Maynard Solomon</bookauthor> <bookprice>18.00</bookprice> <booklistprice>18.00</booklistprice> <bookcategory>Literary Criticism</bookcategory> </book> <book> <booktitle>The Art of Shakespeare's Sonnets</booktitle> <bookauthor>Helen Vendler</bookauthor> <bookprice>17.05</bookprice> <booklistprice>18.95</booklistprice> <bookcategory>Literary Criticism</bookcategory> </book> <book> <booktitle>Grapes of Wrath</booktitle> <bookauthor>Steinbeck</bookauthor> <bookprice>5.00</bookprice> <booklistprice>10.00</booklistprice> <bookcategory>Fiction</bookcategory> </book> </booklist> Encoding Türkçe karakterleri desteklemek için encoding "iso-8859-9" olmalıdır: <?xml version="1.0" encoding="iso-8859-9"?> XML içinde yorum (comment) satırları HTML ile aynıdır. <!-yorum satırı --> XML Prolog XML dosyası içindeki ilk satıra XML prolog denir. Bu satır aşağıdaki gibi olabilir. Prolog bir çeşit declaration'dır (HTML dosyasındaki <html> gibi). Prolog kullanımı zorunlu değildir, ama kullanılması iyi bir alışkanlıktır. <?xml version="1.0"?> <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> PCDATA/CDATA Element data içinde <,” gibi karakterler olabilir mi? Örneğin şu element geçerli midir? <booktitle>Grapes <of> Wrath</booktitle> Bu data içindeki <>karakterlerinin sorun oluşturacağı açıktır. Sibnet XML Eğitimi Lab Çalışması 4 Parser <booktitle> altındaki karakterleri de parse eder. Bunu engellemek için yani parser’ın parse etmemesi için CDATA kullanın. <Booktitle> <![CDATA[The Art < of > Shakespeare's Sonnets]]> </Booktitle> Eğer PCDATA (parse edilebilir kullanabilirsiniz. < için < > için > & için & (escape data) kullanılacaksa aşağıdaki Sibnet XML Eğitimi Lab Çalışması karakterleri characters) 5 3. DTD ve Valid XML DTD ve Valid XML Valid XML ve Document Type Definitions (DTD) kavramları birbirleriyle ilgili kavramdır. Valid XML, kuralları DTD dosyasında belirlendiği gibi yazılmış XML'dir. DTD o XML dokümanı için yazım kurallarını belirler. Hangi tag'ların kullanacağı, hangi sıra ile kullanılacağı, hangi tag'ların zorunlu oldukları DTD içinde belirlenir. DTD kullanımının amacı örneğin bir DB SQL tablosuna XML'den data aktarıyorsak, XML'in içinde bulunması gereken tag'ları kontrol edebilmek, yani XML'in içeriğini test etmektir. DTD'ye uygun bir XML dosyası valid XML'dir. Eğer XML dosyasının içinde DTD dosyası belirtilmiş ise parser XML dosyasını "valid" testine sokacaktır. Lab 1: Valid XML ve External DTD 1. Şimdi books.xml dosyasında (books.xml'in yedeğini aldıktan sonra) ilk book elementinden booktitle ve bookauthor elementlerinin tamamen silin. Yani: <book> <bookprice>18.00</bookprice> <booklistprice>18.00</booklistprice> <bookcategory>Literary Criticism</bookcategory> </book> 2. Şimdi tekrar IE ile books.xml'e bakın. books.xml hala well-formed bir XML dokumanı mıdır? Evet. books.xml hala bir well-formed XML dokümanıdır. Eğer bu dokümanı bir SQL tablosuna ekleyecek olsak sildiğimiz iki tag sorun çıkaracaktır. O halde tabloya ekleme işleminden önce bu XML'de bütün tagların olup olmadığını kontrol edecek bir mekanizmaya ihtiyacımız var. DTD bu amaçla yapılmıştır. 3. books.dtd adlı bir dosya yaratın. Aşağıdaki içeriği yazıp dosyayı kaydedin. <!ELEMENT booklist (book+)> <!ELEMENT book (booktitle, bookauthor, bookprice, booklistprice, bookcategory)> <!ELEMENT booktitle (#PCDATA)> <!ELEMENT bookauthor (#PCDATA)> <!ELEMENT bookprice (#PCDATA)> <!ELEMENT booklistprice (#PCDATA)> <!ELEMENT bookcategory (#PCDATA)> 4. Şimdi XML dosyasına DTD'yi bağlayacak değişikliği yapalım. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE booklist SYSTEM "Booklist.dtd" > <booklist> ... 5. Şimdi books.xml'i IE ile test edin. IE sadece dosyanın well-formed olup olmadığına bakar, valid olmadığına bakmaz. IE'nin dosyanın valid olup olmadığını test etmesi için aşağıdaki işlemleir yapın. Sibnet XML Eğitimi Lab Çalışması 6 6. Eğitmenin size verdiği IEXMLTLS.EXE dosyasını bir foldera açın. INF uzantılı dosyaların üzerinde sağ tuşa basıp install'ı seçerek yükleyin. 7. Şimdi XML dosyasını IE ile açın. Açtıktan sonra pencere üzerinde sağ tuşa basın. 8. Validate XML seçeneğini tıklayın. 9. Şimdi IE XML dosyasının DTD'ye uymadığını yani valid olmadığını bildirecektir. Lab 2: DTD Kuralları <!ELEMENT booklist (book+)> Bu satır XML dokümanının booklist elementinin en az bir book elementinden oluştuğunu belirtir. + işareti child element book elementinin en az bir kere olması gerektiğini belirtir. * işareti child elementin sıfır ya da daha fazla olabileceğini belirtir. ? işareti child elementin sıfır ya da bir (en fazla bir) olabileceğini belirtir. Not: bu karakterler parantezlerin dışına ya da içine uygulanabilir. Örneğin (a|b)+ durumunda <a></a> <b></b> geçerli (valid) bir XML olur. Ancak (a+|b+) farklı anlama gelir. <a> ve <b> aynı dökümanda olamaz. <!ELEMENT book (booktitle, bookauthor, bookprice, booklistprice, bookcategory)> book elementi booktitle, bookauthor, bookprice, booklistprice ve bookcategory adlı elementlerden oluşur. <!ELEMENT booktitle (#PCDATA)> #CDATA : element'in içinde character data var. Bu data parser tarafından parse edilmeyecektir. #PCDATA : elementin içinde parse character data var. Bu data parser tarafından tekrar parse edilir. <!ELEMENT booklistprice EMPTY> EMPTY ifadesi booklistprice elementinin boş (body’si yok) olduğunu belirtir. Bu tag için body varsa doküman validate etmez. ATTLIST; attribute list anlamında. ATTLIST’in tam formatı aşağıda. <!ATTLIST element-name attribute-name attribute-type default-value> attribute-type aşağıdakilerden biri olabilir: Type Description CDATA The value is character data (en1|en2|..) The value must be one from an enumerated list ID The value is a unique id IDREF The value is the id of another element IDREFS The value is a list of other ids NMTOKEN The value is a valid XML name NMTOKENS The value is a list of valid XML names Sibnet XML Eğitimi Lab Çalışması 7 ENTITY The value is an entity ENTITIES The value is a list of entities NOTATION The value is a name of a notation xml: The value is a predefined xml value default-value yerine aşağıdakilerden biri gelebilir: Value Explanation value The default value of the attribute #REQUIRED The attribute is required #IMPLIED The attribute is not required #FIXED value The attribute value is fixed <!ATTLIST booktitle stat CDATA #REQUIRED> Bu satır booktitle elementinin stat adlı bir attribute’u olduğunu gösterir. Stat attribute’u zorunludur ve CDATA tipindedir. Valid XML: <booktitle stat="new" id="e12">The Art of Shakespeare </booktitle> Diğer örnekler: <!-- Attribute Definition --> <!ATTLIST booktitle stat CDATA #REQUIRED> <!ATTLIST booktitle type CDATA "150"> <!ATTLIST booktitle id ID #REQUIRED> <!ATTLIST booktitle id ID #REQUIRED> ID keywordü id attribute’ın key işlevi görmesini sağlar. id unique olmalıdır. id numara olamaz, XML name özelliklerine sahip olmalıdır (string ya da _ ile başlayabilir) Aşağıdaki örnekte birden fazla attribute bir kerede tanımlanmıştır. <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size (small|medium|large) "large" collar CDATA #IMPLIED type CDATA #REQUIRED manufacturer CDATA #FIXED "Levi"> <!ATTLIST booktitle size (low | medium | high) #REQUIRED> Bu örnekte enumeration kullanılmıştır. Size attribute’u ancak low, medium ya da high değerlerinden birini alabilir. <!DOCTYPE booklist SYSTEM "Book3Att.dtd" > Sibnet XML Eğitimi Lab Çalışması 8 DTD içinde hangi elementin root element olacağı tanımlanmaz. Herhangi bir element XML için root element olabilir. Yukarıdaki tanım XML içinde bulunur. booklist elementinin root element olduğu ve DTD’nin file adı verilmiştir. <!ENTITY name "Mercan"> Entity terimi bir çeşit değişken (ya da name-value pair) tanımlamak için kullanılır. Yukarıdaki örnekte name değişkeni “Mercan” değerini almıştır. Aşağıda XML içinde bu değişkenin kullanımı verilmiştir. <bookcategory>&name;</bookcategory> Internet Explorer ile bakıldığında aşağıdaki satır izlenecektir. <bookcategory>Mercan</bookcategory> Transition Graph Aşağıdaki şekle verilen element tanımı için transition graph adı verilir. (Ref. Ducharme, s149) <!ELEMENT chapter (intro, map, (poem|para+), endnotes)> Mixed Content Type Bir elementin datası (body) character ve sub-element tnımından oluşuyorsa mixed content içeriyor denir. Örnek: <!ELEMENT para (#PCDATA | keyword)+ > Đnstance dökümanı <para> Bu bir <keyword> mixed type </keyword> örneğidir. </para> Regular Expression Örnekleri Aşağıdaki örnekte book elementinin altında a ya da b child elementi (sadece biri) ve c elementi olabilir. <?xml version="1.0" encoding="UTF-8"?> Sibnet XML Eğitimi Lab Çalışması 9 <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT book ((a* | b+), c)*> a (#PCDATA)> b (#PCDATA)> c (#PCDATA)> Bu DTD’ye gore valid olan ve olmayan bazı örnekler aşağıda verilmiştir. Valid XML 1 : <book> <c>c</c> </book> Valid XML 3: <book> <a>a1</a> <a>a2</a> <a>a3</a> <c>c</c> </book> Valid XML 2: <book> <a>a</a> <c>c</c> </book> Valid XML 4: <book> <b>a3</b> <c>c</c> </book> Invalid XML (a ve b aynı anda olamaz): <book> <a>a1</a> <a>a2</a> <b>a3</b> <c>c</c> </book> DTD ve XML Schema’da Unordered Sequence Soru: Aşağıdaki instance document’i uyan bir DTD grammer nazıl yazılır? Ancak <fname> ve <lname> herhangi bir sırada olabilir, yani <lname> <fname>’den önce gelebilir. <person> <fname> <lname> </person> Yanıt : <!ELEMENT person ((fname, lname) | (lname, fname)) > Ancak eğer element sayısı 2’den oldukça büyükse yukarıdaki yazılım oldukça zor hale gelir. N element için n! Sıralama yapmak gerekir (permutation). (a,b,c) | (a,c,b) | (b,a,c).... gibi. Oysa aynı durum XML Schema’da oldukça basit çözümlenir: <xsd:all> <fname> <lname> </xsd:all> Internal DTD DTD dosyasının içeriği XML içinde olabilir. books.xml dosyasını aşağıdaki gibi değiştirip tekrar validate edin. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE booklist [ Sibnet XML Eğitimi Lab Çalışması 10 <!ELEMENT booklist (book+)> <!ELEMENT book (booktitle, bookauthor, bookprice, booklistprice, bookcategory)> <!ELEMENT booktitle (#PCDATA)> <!ELEMENT bookauthor (#PCDATA)> <!ELEMENT bookprice (#PCDATA)> <!ELEMENT booklistprice (#PCDATA)> <!ELEMENT bookcategory (#PCDATA)> ] > <booklist> ..... Sibnet XML Eğitimi Lab Çalışması 11 4. XML NameSpace XML NameSpace xml içinde kullanılan tag’ların isimlerinin karışmaması (name collision) için kullanılır. Örneğin aşağıdaki iki <title> ifadesi processing sırasında karışabilir. <catalogEntry> <book> <title>My Theory</title> <isbn>0001</isbn> <author> <title>Dr.</title> <lastName>Expert</lastName> <firstName>Iman</firstName> </author> </book> </catalogEntry> NameSpace için ikili isimlendirme (QName ) kullanılır. Đki isim arasın iki nokta üst üste (:) konur. Örnekler Element için ns <books:book xmlns:books="http://www.library.com/books"/> Notlar: Yukarıdaki örnekte books yerine http://www.library.com/books ifadesini yerleştirerek düşünün. Parser gerçekte http://www.library.com/books gibi ifadeleri kontrol etmez. Bu URI’lerin gerçekte var olması gerekmez. URI olarak domain isimlerinin kullanılmasının tek sebebi her şirket için farklı olmasıdır. Aslında herhangi bir şey kullanılabilir. Attribute için ns <books:book xmlns:books="http://www.library.com/books" books:hardcover='true'/> NameSpace Scope NameSpace tanımlandığı element içinden başlayarak child element’lere de uygulanır. Ancak child elementler farklı bir namespace tanımlayabilirler. <books:book xmlns:books='http://www.library.com/books' books:hardcover='true'> <books:title> Tom Sawyer </books:title> </books:book> Default NameSpace Çoğu element aynı namespace altına ise default namespace kullanılabilir. Ancak Attribute’lar default namespace’i otomatik kullanmazlar. Attribute’lar için mutlaka prefix eklenmelidir (kullanılmak isteniyorsa). Sibnet XML Eğitimi Lab Çalışması 12 Örnek: <book xmlns='http://www.library.com/books' xmlns:books='http://www.library.com/books' books:hardcover='true'> <title>Tom Sawyer</title> </book> Örnek: Aşağıdaki bütün xml dökümanları parser için aynıdır. Bütün örneklerde, subNode tagının namespace’i is uri:my-namespace’dir Deafult NameSpace <mydoc xmlns="uri:my-namespace"> <subnode /> </mydoc> <ns0:mydoc xmlns:ns0="uri:my-namespace"> <ns0:subnode /> </ns0:mydoc> Aşağıdaki örnekte ns0 ve ns1 aynı değerde. <ns0:mydoc xmlns:ns0="uri:my-namespace"> <ns1:subnode xmlns:ns1="uri:my-namespace" /> </ns0:mydoc> Parent ns0 ile child namespace aynı değerde. <ns0:mydoc xmlns:ns0="uri:my-namespace"> <subnode xmlns="uri:my-namespace" /> </ns0:mydoc> Sibnet XML Eğitimi Lab Çalışması 13 5. XML Schema XML Schema Simple Types Tanımlar Simple type: attibute ya da sub element’in olmadığı type def SimpleType olur. Complex type : attribute varsa ya da sub element (ya da child element) varsa, o element complext type olur. Lab 1: XML Schema XML Scheme bir anlamda Java Class dosyalarına benzer. Her ikisi de tanımdır. Scheme’dan üretilen XML dökümanları da Java Class tanımından üretilen Object (ya da instance) dökümanlarına benzer. Bu nedenle XML dökümanlarına instance document de denir. 1. Aşağıdaki XML Scheme dokümanını (Person.xsd) oluşturun. <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Person"> <element name="person"> <complexType> <sequence> <element name="fname" type="string"></element> <element name="lname" type="string"></element> </sequence> <attribute name="id" type="int" use="required"></attribute> </complexType> </element> </schema> 2. Ardından bu Schema’dan bir XML (instance document) oluşturun. Aşağıda geçerli bir XML Instance verilmiştir. <?xml version="1.0" encoding="UTF-8"?> <tns:person id="0" xmlns:tns="http://www.example.org/Person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Sibnet XML Eğitimi Lab Çalışması 14 xsi:schemaLocation="http://www.example.org/Person Person.xsd "> <fname>fname</fname> <lname>lname</lname> </tns:person> Not: tns : this name space anlamında bir kısaltmadır. Aslında yukarıdaki ifadede tns yerine herhangi birşey yazılabilir. 3. Şu • • • durumları test edin. (Değişiklikten sonra her seferinde Validate edin) fname ile lname taglarının yerlerini değiştirin. Attribute id=”bir” yapın. Attribute id’yi kaldırın. 4. Schema’ya Middle Name elementi eklemek istiyoruz. Öyle ki bir kişinin <mname> elementi ya olmaya bilir ya da en fazla 3 tane olabilir. Scheme’yı aşağıdaki gibi değiştirip test edin. Test için XML instance dökümanına <mname> ekleyip validate edin. <element name="mname" type="string" minOccurs="0" maxOccurs="3"></element> 5. schemaLocation. Xml dökümanındaki schemaLocation attribute’ına dikkat edin. Bu attribute Parser’a validation sırasında kullanılacak schema dökümanının yerini söyler. xsi:schemaLocation="http://www.example.org/Person Person.xsd "> Notlar: schemaLocation Parser için sadece bir ipucudur. Bu dosya bulunamazsa Parser sadece well-formed kontrolü yapar. Yukarıdaki satırda Person.xsd yerine (olmayan) Person1.xsd yazın. <fname> tagı yerine herhangi bir tag ekleseniz sorun çıkmaz, ancak bu kez sadece well-formed kontrülü yapılır. schemaLocation içindeki değerler ikili haldedir. Đlk değer kullanılacak namespace, ikinci değer schema dosyasıdır. schemaLocation yerine (olmayan) schemaLocationXX yazarsanız ne olur? xmlns:xsi ifadesi bir namespace tanımlar. Bu namespace aşağıdadır. Bu namespace xml dökümanının kendisinin bir xml instance olduğunu ve schema ile ilgili attribute’ların validate edileceğini söyler. Eğer schemaLocation yerine (olmayan) schemaLocationXX yazılacak olursa parser validate etmeyecek ve xml dökümanını bir schema’ya bağlamayacaktır. Sonuçta sadece well-formed testi yapar. http://www.w3.org/2001/XMLSchema-instance 6. targetNamespace. Scheme tanımları XML NameSpace yaratırlar. Person.xsd içindeki targetNameSpace tanımını aşağıdaki gibi değiştirin. targetNamespace="http://www.example.org/People" Instance XML dökümanını validate edin. Hata alırsınız. Düzeltmek için neyi değiştirmeniz gerekir? 7. simpleType. Başka Bir Örnek. type1.xsd adlı yeni Schema dosyası oluşturun. Aşağıdakileri yazın. <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mycorp.com/Schema/type1" Sibnet XML Eğitimi Lab Çalışması 15 xmlns:tns="http://www.mycorp.com/Schema/type1"> <xsd:simpleType name="quantityType"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="2" /> <xsd:maxInclusive value="5" /> </xsd:restriction> </xsd:simpleType> <xsd:element name='quantity' type="tns:quantityType" /> </xsd:schema> Şimdi aşağıdaki gibi bir instane doküman oluşturun. Ancak 2-5 arası değerler valid’ir. <?xml version="1.0" encoding="UTF-8"?> <tns:quantity xmlns:tns="http://www.mycorp.com/Schema/type1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mycorp.com/Schema/type1 type1.xsd "> 8 </tns:quantity> 8. elementFormDefault="qualified" ya da “unqualified”. Bu değer unqulified şeklinde ise instance dökümanında root element dışındakiler (child elementler) namespace qualified olabilir. Yukarıdaki örnekte Person.xsd tanımlamıştınız. Schema’ya aşağıdaki gibi elementFormDefault="qualified" ekleyin. <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Person" elementFormDefault="qualified"> <element name="person"> <complexType> <sequence> <element name="fname" type="string"></element> <element name="lname" type="string"></element> </sequence> <attribute name="id" type="int" use="required"></attribute> </complexType> </element> </schema> Şimdi aşağıdakı XML instance validate etmez (yukarıdaki eklemeyi yepmedan önce ederdi) <?xml version="1.0" encoding="UTF-8"?> <tns:person id="0" xmlns:tns="http://www.example.org/Person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Person Person.xsd "> <fname>fname</fname> <lname>lname</lname> </tns:person> Sorunu gidermek için child elementleri (fname, lname) (bu elementlere locally declared element de denir, root element ise globally declared olur) qualified yapın. <?xml version="1.0" encoding="UTF-8"?> <tns:person id="0" xmlns:tns="http://www.example.org/Person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Person Person.xsd "> <tns:fname>fname</tns:fname> Sibnet XML Eğitimi Lab Çalışması 16 <tns:lname>lname</tns:lname> </tns:person> 9. attributeFormDefault="qualified" ise (default yoktur ve unquaified olarak kabul edilir) ise instance bütün attribute’lar namespace qualified olmalıdır. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/person" xmlns:tns="http://www.example.org/person" elementFormDefault="qualified" attributeFormDefault="qualified" > 10. ComplexContext <xs:element name="stockAction"> <xs:complexType> <xs:complexContent> <xs:attribute name="category" type="xs:string" /> <xs:element name="stockSymbol" type="xs:string" /> </xs:complexContent> </xs:complexType> </xs:element> Örnek XML instance dokümanı <stockAction category="buy"> <stockSymbol>IBM</stockSymbol> </stockAction> 11. include. Đki Schema’yı birleştirmek <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.mycorp.com/Schema/type1" xmlns:yk=http://www.mycorp.com/Schema/type1> <include schemaLocation="type1.xsd"/> <element name="person"> <complexType> <sequence> <element name="fname" type="string"></element> <element name="lname" type="string"></element> <element name="age" type="yk:quantityType"></element> </sequence> <attribute name="id" type="int" use="required"></attribute> </complexType> </element> </schema> 12. Schema import. Aşağıdaki örnekte başka bir Schema dosyasından bir type import edilmiştir. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Person" xmlns:yk="http://www.mycorp.com/Schema/type1"> <import schemaLocation="type1.xsd" namespace="http://www.mycorp.com/Schema/type1" /> <element name="person"> <complexType> <sequence> <element name="fname" type="string"></element> Sibnet XML Eğitimi Lab Çalışması 17 <element name="lname" type="string"></element> <element name="age" type="yk:quantityType"></element> </sequence> <attribute name="id" type="int" use="required"></attribute> </complexType> </element> </schema> Örnek Đnstance dökümanı (age sadece 3-5 arası olabilir) <tns:person id="0" xmlns:tns="http://www.example.org/Person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Person Person.xsd "> <fname>fname</fname> <lname>lname</lname> <age>3</age> </tns:person> 13. Schema import. Ref.Aşağıdaki örnekte başka bir Schema dosyasından bir element import edilmiştir. Element import eden satıra dikkat edin. Bu satırda yeni bir element adı veremezsiniz. <element ref="yk:quantity"></element> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Person" xmlns:yk="http://www.mycorp.com/Schema/type1"> <import schemaLocation="type1.xsd" namespace="http://www.mycorp.com/Schema/type1" /> <element name="person"> <complexType> <sequence> <element name="fname" type="string"></element> <element name="lname" type="string"></element> <element ref="yk:quantity"></element> </sequence> <attribute name="id" type="int" use="required"></attribute> </complexType> </element> </schema> Instance dokümanı: <tns:person id="0" xmlns:tns="http://www.example.org/Person" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/Person Person.xsd " xmlns:yk="http://www.mycorp.com/Schema/type1"> <fname>fname</fname> <lname>lname</lname> <yk:quantity>3</yk:quantity> </tns:person> 14. Pattern Value <xsd:schema targetNamespace='http://www.SampleStore.com/Account' xmlns:xsd='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account'> <xsd:element name='InvoiceNo' type='xsd:positive-integer'/> <xsd:element name='ProductID' type='ACC:ProductCode'/> Sibnet XML Eğitimi Lab Çalışması 18 <xsd:simpleType name='ProductCode' base='xsd:string'> <xsd:pattern value='[A-Z]{1}d{6}'/> </xsd:simpleType> DTD Schema Karşılaştırması Sibnet XML Eğitimi Lab Çalışması 19 6. XPath RAD ile aşağıdaki çalışmayı yapın. 1. Aşağıdaki XML dosyasını oluşturun. Book.xml: <booklist> <book> <title stat="" id="B1">Ince Memed</title> <author>Yaşar Kemal</author> <price>25.4</price> <listprice>30</listprice> <category>Roman</category> </book> <book> <title stat="" id="B2">Kaçak</title> <author>Orhan Kemal</author> <price>15</price> <listprice>20</listprice> <category>Roman</category> </book> </booklist> 2. Ardından aşağıdaki gibi boş bir XSL dosyasını oluşturun. <xsl:template match="booklist/*/author/text()"> </xsl:template> 3. match attribute’ın boş değerini (iki tırnak arası) tıklayın. Ve mouse sağ tuşa basın. Context menüden XPath Expression’ı seçin. Sibnet XML Eğitimi Lab Çalışması 20 4. Evaluation Context. Şu aşağıdakiler a ve b eşit sonuç verir. a. Context = / booklist/*/author/text() b. Context = /booklist/ */author/text() Bu durum relative path ve absolute path gibidir. Sonuçta bütün evaluation bir context noktasına (ya da context noktasından sonra) göre yapılır. Context noktası tree yapısındaki bir node’a denk gelir. 5. Örnekler a) Bütün yazarların listesi : /booklist/*/author/text() Ya da /booklist/book/author/text() b) Đlk kitabın yazarı: /booklist/book[1]/author/text() c) Bütün yazarların listesi (XML formatında) /booklist/book/author d) Son kitabın yazarı (Text) /booklist/book[last()]/author/text() e) Đlk book elementinin title child elementinin id adlı attribute’u (text) /booklist/book[1]/title/@id f) Aşağıdakinin sonucu bir XML /booklist/book[1]/ Sonuç: <book> <title id="B1" stat="">Ince Memed</title> <author>Yaşar Kemal</author> <price>25.4</price> <listprice>30</listprice> <category>Roman</category> </book> g) Çift Slash //. Ancak aşağıdaki book[1]altındaki bütün text değerleri veriyor: /booklist/book[1]//text() Sonuç: Ince Memed Yaşar Kemal 25.4 30 Roman h) Logical Operator (equality, or, and). Aşağıdaki örnek id attribute’ı B1 ya da B2 olan bütün kitapların adını döküyor. /booklist/book/title[@id="B1" or @id="B2" ]/text() Sibnet XML Eğitimi Lab Çalışması 21 Sonuç: Ince Memed Kaçak i) Yazarı Yaşar Kemal olan kitabın fiyatı : /booklist/book[author="Yaşar Kemal"]/price/text() Sonuç: 25 j) Child axis : Aşağıdaki iki path exp. aynı sonuç verir: /booklist/child::book/title[@id="B1" or @id="B2" ]/text() /booklist/book/title[@id="B1" or @id="B2" ]/text() child::book ifadesinde okumayı ‘child::’ ve ‘book’ diye ayırın. (aslında default axis child:: olduğundan dolayı) k) Evaluation Context. RAD Path Builder’da aşağıdakiler aynı sonuç vermez. a. Evaluation Contect : /booklist/book/title/.. Relative path : (boş) Bu ifade iki book elementini birden getirir. a. Evaluation Contect : /booklist/book/title/ Relative path : .. Bu ifade tek (current) book elementini getirir. l) Count(). Kitap node’larının sayısını bulmak. Evaluation context : /booklist/ Relative : count(book) Sonuç: 2.0 Sibnet XML Eğitimi Lab Çalışması 22 7. XSL StyleSheet ve XSLT XSLT pattern matching ve template kavramlarını kullanır. XSL Processor source XML’in tree yapısını oluşturur. Processor tree yapını tarar. Eğer XSL içinde tarif edilen bir nod (matching node) (element/attribute) bulursa karşılık gelen template’i çağırıp templete içindeki kuralları uygular. Đşlem bütün template’ler uygulanana kadar devam eder. Pattern Matching: XPath kullanılabilir. Bu iki template örneğinde de match değeri XPath ile verilmiştir. match="booklist" ya da match="/booklist" kullanılabilir. <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="booklist"> <html> <head> <title>Kitap Listesi</title> </head> <body> <H1>My Book List</H1> <H3>XSL ile hazirlandi</H3> <table border="1"> <xsl:apply-templates select="book" /> </table> </body> </html> </xsl:template> Basit Bir Örnek 1. Aşağıdaki Sample.css dosyasını oluşturun: @CHARSET "ISO-8859-1"; author { color: lime; font-family: "Book Antiqua"; font-size: 14pt } 2. Sample.xml dosyası da aşağıdaki gibi oluşturup browser ile açın. <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="Sample.css" type="text/css" ?> <books> <book> <author>Greg Scott</author> <title>Computer Choreography</title> </book> </books> XSL 1. Books.xsl adlı bir dosya açın (notepad ya da herhangi bir text editor ile) 2. Her XSL dosyası aşağıdakine benzer satırlar ile başlar bu satırları dosyaya ekleyin. <?xml version="1.0" encoding="iso-8859-9"?> <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'> Sibnet XML Eğitimi Lab Çalışması 23 <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> Not: her xsl dosyası aslında bir xml dosyasıdır. Bu nedenle tag açılış kapanışları xml gibi olmalıdır. xsl içinde Türkçe karakterleri desteklemek için ilk satırda encoding iso-8859-9 olmalıdır. 3. Şimdi XML dosyamızdaki booklist elementinin (en üstteki element) nasıl gösterileceğini (presentasyon) belirteceğiz. <xsl:template match="booklist"> <html> <head><title>Kitap Listesi</title></head> <body> <H1>My Book List</H1> <H3> XSL ile hazirlandi</H3> <table border="1"> <xsl:apply-templates select="book"/> </table> </body> </html> </xsl:template> Notlar: Parser XML dosyasındaki her booklist elementi için yukarıdaki satırları bir kere çalıştıracaktır. XML dosyasında sadece bir tane booklist elementi olduğundan gerçekte bu satırlar sadece bir kere çalışır. Yukarıdaki <xsl:template match="booklist"> satırını, parametresi booklist olan bir çeşit fonksiyon gibi düşünün. Bu fonksiyon tamamlanmadan, bir kez daha ancak bu kez book için çağrılacaktır. Her book elementi için ayrı ayrı cağrıldıktan sonra tekrar ana fonksiyona döneecktir. <xsl:template match="booklist"> tag'ı içinde kalan HTML tag ve normal satırlar outputa yazılır. 4. book elementi outputa yazmak için yine <xsl:template match="book"> tagını kullanacağız. Aşağıdaki satırları da books.xsl dosyanıza ekleyin. <xsl:template match="book"> <tr> <td><xsl:value-of select="booktitle"/></td> <td><xsl:value-of select="bookauthor"/></td> <td><xsl:value-of select="bookcategory"/></td> </tr> </xsl:template> Not: <xsl:value-of select="booktitle"> tagı book içindeki booktitle tagının değerini outputa yazar. 5. books.xsl dosyasına </xsl:stylesheet> tagi ile başlamıştık. Şimdi son satır olarak bu tag'ı kapatın. </xsl:stylesheet> Sibnet XML Eğitimi Lab Çalışması 24 6. books.xsl dosyası tamamlandığına göre bunu XML'e uygulayalım. XML parserlar dinamik olarak XML dosyasını açıp XSL dosyasını doğrudan uygulayabilirler. Outputu ya bir dosyaya yazabilirler ya da web browser'a doğrudan yönlendirebilirler. Ancak aşağıda XML dosyası içine uygulanacak olan XSL'i doğrudan yazacağız. a. books.xml dosyasını açın. b. Đlk iki satırını aşağıdaki satırlarla değiştirin. <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="books.xsl" ?> c. Şimdi books.xml dosyasını browser ile açın. Sonuç: XML dosyası hazırladığımız XSL formatında gelecektir. Ek. Books.xsl <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="booklist"> <html> <head><title>Kitap Listesi</title></head> <body> <H1>My Book List</H1> <H3> XSL ile hazirlandi</H3> <table border="1"> <xsl:apply-templates select="book"/> </table> </body> </html> </xsl:template> <xsl:template match="book"> <tr> <td><xsl:value-of select="booktitle"/></td> <td><xsl:value-of select="bookauthor"/></td> <td><xsl:value-of select="bookcategory"/></td> </tr> </xsl:template> </xsl:stylesheet> Sibnet XML Eğitimi Lab Çalışması 25 8. XSL StyleSheet ve XSLT - 2 XSL Transformtion Genel Çalışma Prensibi: Parser XML source tree yapısını oluşturup, onun üzerinde process’e başlar. Root node(/) da n işleme başlar. XML dökümanlarında iki tane root node bulunduğuna dikkat edin. Birincisi implicite root node (/) diğeri ise XML’de belirtilen explicite root node (/booklist). Đlk önce imlicite root node (/) için match edecek template arar. Bulduğunda bundan sonra nasıl işleyeceğine o template içindeki kurallar belirler. Eğer match template’in içi boş ise processing orada biter ve outout’a (result tree) hiç bir şey yazılmaz. Processing’in devam etmesi için tample içinde <xsl:apply-template> ya da <xsl:calltemplate> olmalı. Eğer / için bir match template bulunanamış ise processing bir sonraki node (/booklist) için devam eder. Yukarıda yazılanlar onun için de tekrar eder. Eğer /booklist de match etmezse, bu kez child elementler olan (book) için template arar. Burada current node booklist olacağından match=”book” template’i bulunacaktır (yani match=”/book” yazmak gereksiz). Eğer /booklist/book ve /booklist/dvd gibi iki çeşit child element varsa ve sadece match=”book” template’i varsa book ve altındaki bütün nodelar için bu kurallar ( <xsl:template match=”book> elementi içindeki kurallar) uygulanacaktır. /booklist/dvd için bir match eden template bulunamazsa processing “default” davranışını uygulayacak ve o kısımdaki bütün ağacı pars ederek en sonunda text node’ların değerini yazacaktır (tree yapısının /booklist/dvd ağacı için) Örnekler: Aşağıdaki örneklerde boş bir XSL dökümanı ile başlanıp adım adım eklemelerle konu (yukarıda yazılanlar) incelenmiştir. Durum 1 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:xalan="http://xml.apache.org/xslt"> </xsl:stylesheet> Sonuç: Ince MemedYaşar Kemal25.430RomanKaçakOrhan Kemal1520Roman Yorum: Bu node’lar doğrudan ya da parent nodları bulunamadı. Parent node’u bulsaydı <apply-template> arardı. Durum 2 Aşağıdaki ve daha sonraki kodlarda XSL root element <xsl:stylesheet> in sadece body’si gösterilmiştir. <xsl:template match="book">OK</xsl:template> Sonuç: OKOK Yorum: iki tane book elementi buldu. Durum 3 <xsl:template match="author">OK</xsl:template> Sonuç: Ince MemedOK25.430RomanKaçakOK1520Roman Yorum: Yukarıda iki tane OK olduğuna dikkat edin. Diğer node’ar (ya da herhangi bir parentları ) buunamadığından text’i yazdı. Durum 4 Sibnet XML Eğitimi Lab Çalışması 26 <xsl:template match="book">BK-</xsl:template> <xsl:template match="author">AT-</xsl:template> Sonuç: BK-BKYorum: Author’un parent’ı book bulundu. Processing context book nodunda. Onun içinde apply-template demeden tekrar author nodunu göremez. Durum 4 <xsl:template match="book">BK<xsl:apply-templates></xsl:apply-templates> </xsl:template> <xsl:template match="author">AT-</xsl:template> Sonuç: BK- Ince MemedAT-25.430RomanBK- KaçakAT-1520Roman RAD XSLT Debugger RAD7 içindeki XSL Debugger çok güçlü. Mutlaka incelemekte yarar var. Sibnet XML Eğitimi Lab Çalışması 27 9. XQuery DB2 9 PureXML Örnekleri Aşağıdaki örnekler DB2 9.x’de SAMPLE database’i üzerinde Command Editor ile test edilmiştir. CUSTOMER tablosu içinde INFO kolonundaki bir değer: <?xml version="1.0" encoding="UTF-8" ?> <customerinfo xmlns="http://posample.org" Cid="1000"> <name>Kathy Smith</name> <addr country="Canada"> <street>5 Rosewood</street> <city>Toronto</city> <prov-state>Ontario</prov-state> <pcode-zip>M6W 1E6</pcode-zip> </addr> <phone type="work">416-555-1358</phone> </customerinfo> 1. Bütün customer’ların adları : xquery declare default element namespace "http://posample.org"; db2-fn:xmlcolumn ('CUSTOMER.INFO')/customerinfo/name/text() Sonuç: Kathy Smith Kathy Smith Jim Noodle Robert Shoemaker Matt Foreman Larry Menard 6 record(s) selected. 2. Toronto’da yaşayan customer’ların adları : xquery declare default element namespace "http://posample.org"; db2-fn:xmlcolumn ('CUSTOMER.INFO')/customerinfo[addr/city = "Toronto"]/name/text() Sonuç: Kathy Smith Matt Foreman Larry Menard 3 record(s) selected. 3. Adı “Matt Foreman” olan customer’ın iş (“work”) telefonu(telefonları) (xquery kısmı yukarıdaki gibi) ('CUSTOMER.INFO')/customerinfo[name = "Matt Foreman"]/phone[@type="work"]/text() Sonuç: 905-555-4789 1 record(s) selected. Diğer Notlar Sibnet XML Eğitimi Lab Çalışması 28 PureXML.doc dökümanından alınmıştır. XQuery vs XPath Xpath bir XML dokümanındaki farklı noktalara ulaşmak için kullanılır. Oysa XQuery bir grup XML dökümanı üstünde işlem yapabilir. Yani 8 adet XML dökümanından <total> nodu toplanacaksa Xpath 8 dökümanı toplu halde bir loop içinde process edemez. Ama Xquery edebilir. Node vs Element <customer> <phone type=”home”> 0216 </phone> </customer> Node: document node, element node, attribute node, text node Element node : Customer, Phone Attribute Node: type Text Node : 0216 XQuery Örnekleri For loop ve sequence xquery for $a in (1 to 3,8,9) return $a Output: 1 2 3 8 9 Bütün phone node’larını döner xquery declare default element namespace "http://posample.org"; for $cust in db2-fn:xmlcolumn ('CUSTOMER.INFO') return $cust//phone Output: <phone xmlns="http://posample.org" type="work"> 416-555-1358 </phone> <phone xmlns="http://posample.org" type="work"> 905-555-7258 </phone> <phone xmlns="http://posample.org" type="work"> 905-555-7258 </phone> Adı “Matt Foreman” olan customer’ın bütün telefonları xquery declare default element namespace "http://posample.org"; for $cust in db2-fn:xmlcolumn ('CUSTOMER.INFO') return $cust/customerinfo[name = "Matt Foreman"]/phone/text() Output: 905-555-4789 416-555-3376 Adı “Matt Foreman” olan customer’ın iş (“work”) telefonu(telefonları) ('CUSTOMER.INFO')/customerinfo[name = "Matt Foreman"]/phone[@type="work"]/text() Sibnet XML Eğitimi Lab Çalışması 29 XQuery – sqlquery function Aşağıdaki iki komut aynı şeyi döner. xquery declare default element namespace "http://posample.org"; db2-fn:sqlquery('select info from customer') xquery declare default element namespace "http://posample.org"; db2-fn:xmlcolumn ('CUSTOMER.INFO') sqlquery üstünde çalışılacak kayıt sayısını sınırlandırabilir. Sqlquery’in return tipi de bir sequence’dir. Ve tek kolon return edebilir. O da xml tipinde olmalıdır. Örneğin aşağıda customer id değeri 1001 olan kullanıcının bütün telefonlarının listesi verilmiştir. xquery declare default element namespace "http://posample.org"; db2-fn:sqlquery('select info from customer where cid=1001')/customerinfo/phone/text() XQuery – function’lar xquery lower-case('XXX') XQuery - diğer örnekler • Kadana’da yaşayan customer’ların isimleri xquery declare default element namespace "http://posample.org"; for $cust in db2-fn:xmlcolumn ('CUSTOMER.INFO')/customerinfo where $cust/addr[@country = "Canada"] return $cust/name/text() XQJ – XQuery for Java Xquery için Java API. Bu aslında JDBC’ye çok benzer, ancak bu kez Java içinden SQL yerine Xquery kullanılıyor. XQJ JSR 225 olarak da bilinir, Java Community Process (JCP) tarafından standartlaştırılmaktadır. Sibnet XML Eğitimi Lab Çalışması 30 10. Java ile XML Parsing XML dosyalarını okuyabilen iki çeşit XML Parser var: Simple API for XML (SAX) Parser Document Object Model (DOM) Parser SAX parser XML dokümanına seri (sırayla) erişim yapar. DOM parser ise XML dokümanını agaç (tree) yapısı olarak dizer. Her iki parser için gerekli olan API çeşitli dillerde ve platformlarda (java, VB, LotusScript gibi) bulunur. SAX parser oldukça hızlıdır. Event-driven bir modeldir. Programcı callback method'ları yazar. Parser XML'i okurken karşılaştığı event'lerde bu callback methodları çağırır. Lab Çalışması Bu lab çalışmasında books.xml dosyasını parse edip okuyan bir SAX parser yazacaksınız. Bu parser books.xml içinde yer alan book, booktitle gibi elementleri sayacaktır. Not: Burada yazılacak olan parser nonvalidating parser olacaktır. Bu parser XML dosyasında olması gereken tag'ları belirleyemez. Ancak bu parser xml dokümanının well-formed olduğunu test eder. Bu çalışmada Eclipse kullanın. 1. Ana dizinde books.xml dosyasını oluşturun. (Eclipse içinden new other file ile yeni bir dosya yaratın.) 2. sax paketi içinde main methodu olan Books adlı java class'ı oluşturun. package sax; public class Books { public static void main(String[] args) { } } 3. Yazacağınız koda aşağıdaki class'ları kullanacaktır. Bu import'ları ekleyin. import import import import import import java.io.*; java.util.*; org.xml.sax.*; org.xml.sax.helpers.DefaultHandler; javax.xml.parsers.SAXParserFactory; javax.xml.parsers.SAXParser; 4. SAX parser dokümanı okurken, dokümanın açılış ve kapanışı, bir tag açılış ve kapanışı gibi olaylarla (event) karşılaştıkça startDocument, endDocument, startElement, endElement, characters gibi methodları devreye sokar. Bu methodlar ContentHandler interface'i içinde tanımlanmıştır. Bu methodların programcı tarafından yazılması gerekmektedir. Ancak ContentHandler interface'ini implement etmek yerine DefaultHandler class'ını extend etmek daha kolaydır. DefaultHandler söz konusu methodların hepsini dummy (boş gövde {}) implement etmiştir. class tanımını aşağıdaki gibi değiştirin. public class Books extends DefaultHandler { 5. Parser'ın yaratılması. Java'da herşey bir nesne olduğuna göre, parser nesnesinin de yaratılması ve devreye sokulması gerekir. Bu işlem main içinde olacaktır: Sibnet XML Eğitimi Lab Çalışması 31 public static void main(String argv[]) { // Use an instance of ourselves as the SAX event handler DefaultHandler handler = new Books(); // Use the default (non-validating) parser SAXParserFactory factory = SAXParserFactory.newInstance(); try { // Parse the input SAXParser saxParser = factory.newSAXParser(); saxParser.parse( new File("books.xml"), handler ); } catch (Throwable t) { t.printStackTrace(); } } 6. EventHandler Şimdi SAX parser XML'i okudukça çağıracağı method'ları yazalım. Dokumanın okunuş ve kapanışlarında çağıracağı method'lar startDocument ve endDocument. Bu methodları kullanmayacağız ancak tanımları aşağıdadır. public void startDocument() throws SAXException } public void endDocument() } throws SAXException { { Her yeni element ile karşılaştığında çağıracağı method startElement(). Bu method içinde, bütün element'lerin kaç kere geçtiğini saymak istiyoruz. Bunun için Hashtable kullanıyoruz. public void startElement(String namespaceURI, String sName, // simple name (localName) String qName, // qualified name Attributes attrs) throws SAXException { Integer cnt = (Integer)h.get(qName); int c=0; if (cnt!=null) c = cnt.intValue(); h.put(qName, new Integer(c+1)) ; } endElement()'i kullanmıyouz. Ancak aşağıda nasıl tanımlandığı verilmiştir. public void endElement(String namespaceURI, String sName, // simple name String qName // qualified name ) throws SAXException { } Elementin gövdesini okurken aşağıdaki methodu çağırır. Kitap adları gibi gerçek dataları aslında characters methodu okuyacaktır. Bu method'u da kullanmayacağız. public void characters(char buf[], int offset, int len) Sibnet XML Eğitimi Lab Çalışması 32 throws SAXException { String s = new String(buf, offset, len); } 7. Hashtable'ı yazdırın. Son olarak hashtable içine topladığımız değerleri görmek için şu satırları main() içinde en sona ekleyin. Enumeration en = h.keys(); while (en.hasMoreElements()){ String key = (String)en.nextElement(); System.out.println( key + ":" + h.get(key)); } 8. SAX parser'ınız hazır. Çalıştırabilirsiniz. 9. Non-validating parser. Şimdi xml dosyasında tag açılışlarından birinin baş harfini büyük yapıp parser'ı çalıştırın. Parser hata verecektir. Bir kez de xml'den bir tagi silin. Parser validation yapmadan çalışacaktır. Sibnet XML Eğitimi Lab Çalışması 33 11. Java ile XSLT - XML Transformasyonu XML dosyası XSLT API ile başka bir XML'e (DTD'si farklı) ya da örneğin bir HTM dosyasına dönüşebilir. Aşağıdaki örneği yapmadan önce books.xsl dosyasını projenizin içinde en üst dizinde oluşturun. Programın outputu olarak books.html dosyasını göreceksiniz. (Eclipse'de projenizi refresh edin) Eğer bu bir servlet olsaydı, transformation bir dosyaya yazılacağına response out nesnesine doğrudan yazılıp browser'a aktarılabilirdi. import javax.xml.transform.*; import javax.xml.transform.stream.*; import java.io.*; public class Trans { public static void main(String[] args) { System.out.println("JAXP API : XSL Java"); try { TransformerFactory tFactory= TransformerFactory.newInstance(); StreamSource xslSource = new StreamSource("book.xsl"); Transformer transformer = tFactory.newTransformer(xslSource); StreamSource xmlSource = new StreamSource("books.xml"); StreamResult htmlResult = new StreamResult("book.html"); transformer.transform(xmlSource, htmlResult); } catch (Exception e) { e.printStackTrace(); } } GetWeather WebServisi Bu da bi başka örnek. Web service eğitiminde kullanılmıştı. Bu kez XML bir String içinde geliyor. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String il = request.getParameter("City"); GlobalWeatherSoap gw = new GlobalWeatherSoapProxy(); try { String ret = gw.getWeather(il, "Turkey"); TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(new StreamSource(getServletContext().getRealPath("weather.xsl"))); Source source = new StreamSource(new StringReader(ret)); StreamResult result = new StreamResult(new StringWriter()); transformer.transform(source,result); String xmlString = result.getWriter().toString(); System.out.println(xmlString); request.setAttribute("set", xmlString); getServletContext().getRequestDispatcher("index.jsp"). forward(request, response); } catch (Exception e) { // TODO: handle exception } } Sibnet XML Eğitimi Lab Çalışması 34 12. Ek- RAD’da XML Open With System Editor. XML dosyasının üzerinde context menu açıldığında “Open With System Editor" Internet Explorer ile açıyor. Sibnet XML Eğitimi Lab Çalışması
Benzer belgeler
++XML-ILERI XML-icindeki
3 DTD
DTD Nedir?
DTD’nin Tan›mlanmas›
Internal DTD
Internal DTD Sözdizimi
External DTD
DTD’nin Yap› Tafllar›
Element
Attribute
Entity