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 &lt;
>
için &gt;
&
için &amp;
(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

++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

Detaylı