Görüş Bildir
Haberler
Xml dökümanı nedir ?

Xml dökümanı nedir ?

Serkan Akpınar
28.03.2014 - 22:52 Son Güncelleme: 28.03.2014 - 23:52

Xml dökümanı nedir ?

XML platformlar arası bir haberleşme dili olarak daha hızlı evrensel bir dildir. Xmlbazılarına göreyse yeni bir web devrimidir.XML bazen dokümanları depolamak amacı ile birveri tabanı olarak kullanılır.Fakat XML nin temel amacı veri depolamak değildir.XML ingeliştirilmesinin temel amacı bir sistemden diğerine ortak bir format içinde bilgileri

geçirmektir.

XML (eXtensible Markup Language) bir data formatıdır.XML yapılandırılmışdokümanların web üzerinde el değiştirilmesi için geliştirilmiştir. World Wide Webconsortium(w3c) tarafından tanımlanmış bir standarttır. XML hakkında bilgiye ve onunla ilişkili teknolojiler http://www.w3.org/XML adresinden bulunabilir.

XML Dokümanlarının PHP ile Kullanılması

Bazı özel karakterler probleme sebep olabilir.Örneğin <,> karakterleri taglar için

kullanılır.XML içinde kullanılan <,>karakterlerine bir tag olarak davranılır.

Entity kavaramı özel karakterlerin kullanılması olanaklı kılmak için kullanılır.

Entity karakter kombinasyonudur.Bu kombinasyon bir & karakteri ile başlar ve ; karakteri ile

biter.

XML dokümanı içinde özel karakterleri kullanmak yerine bu kombinasyonu kullanabilirisin.

Entity ler olması gerektiği gibi tanınırlar ve özel karakterler olarak davranılmazlar.

Örneğin < karakterini göstermek için < kombinasyonunu ve < karakterini göstermek içinse

> karakterini kullanabilirsin.

Entity leri kullandığın zaman özel karakterler dokümanına dahil edilir ve bunlara bir tag

olarak davranılmazlar.

Entity ler ayrıca ascii olamayan karakterlerin dokümanınıza girilmesi içinde kullanılır örneğin

€ ve ë karakterleri.Bu iki karakter için entity ler € ve ë dir. http://www.w3.org/

TR/REC-html40/sgml/entities.html. özel karakterler için entity listesidir.& karakter için

&XML DÖKÜMANLARINI ÇÖZÜMLEMEK

XML DÖKÜMANININ ÇÖZÜMLENMESI

Xml dokümanı okumak için iki teknik kullanılır :SAX(Simple Api for XML )

DOM(Document Object Model).SAX :XML dokümanı boyunca ilerlerken her tag

başlangıcında ve bitişinde ya da farklı bir element ile karşılaşıldığında bir olay ateşlenir.Bu

ateşlenen olaylara hangi fonksiyonları bağlayacağını ve bu fonksiyonların bu olaylar

karşılığında hangi komutlarla karşılık vereceğini kodlamalısın. (nasıl yöneteceğine karar

vermelisin.)DOM:Bu metoda göre tüm XML bir ağaç yapısındadır.Bu ağaç yapısı içinde PHP

fonksiyonları kullanarak gezinebilirsin

Not:PHP diğer bir yol daha sunar bu yol SimpleXML Extension u kullanmaktır.

S.imple A.pi for X.ml (SAX)

lk olarak bir parser nesnesi yaratmalıyız ve daha sonra bu olayları yönetmek için kodlarımız

yazmalıyız.

$xml = xmlparsercreate('UTF-8');

Bu fonksiyon başarı ile çalıştığı zaman ,bir XML parser yöneticisi döndürür Bu yönetici diğer

XML parsing fonksiyonları ile kullanılır.

3-14

XML Dokümanlarının PHP ile Kullanılması

Sax olay yönetimi mantığı ile çalışır.Bu olayları yönetmek için olay yöneticileri (fonksiyon

lar) geliştirmeliyiz.Bu temel örnekte üç olayı yönetmeye çalışacağız bu olaylar;tag açılışı ,tag

kapanışı ve karakter verisine rastlanması olaylarıdır.Bu olaylar önemlidir.

xmlsetelementhandler($xml, 'starthandler', 'endhandler');

xml
setcharacterdatahandler($xml, 'characterhandler');

Bu fonksiyonlar ile iki yöneticiyi tanımlarız.Bu tanımlamalar herhangi bir olay meydana

gelmeden yapılamalıdır.Şimdi yönetici fonksiyonların nasıl tanımlandığına bakalım.

Bir önceki ifadede start_handler yönetici fonksiyonu üç parametreyi alır. lk parametre XML

parser object ,ikincisi tagın ismi ,son parametre ise bir dizidir.Bu dizide taga ait tanımlayıcı

attribute ler.TAG BAŞLANGICI

Tag isimleri varsayılan olarak büyük harf ile geçirilir.Bu durumu değiştirmek için aşağıdaki

ifadeyi kullanın.Bu ifadedeki xml değişekeni xml parser nesnesidir.

xmlparsersetoption($xml, XMLOPTIONCASEFOLDING, false);

function starthandler ($xml, $tag, $attributes)

{

global $level;

echo 'n'. str
repeat(' ', $level). '>>>$tag';

foreach ($attributes as $key => $value) {

echo ' $key $value';

}

$level++;

}

TAG KAPANIŞI

Sadece XML nesnesi ve tag ismi gönderilir.

function endhandler ($xml, $tag)

{

global $level;

$level--;

echo str
repeat(' ', $level, ' '). '<<<$tag;

}

Bütün içiriği göstermekte kullanacağız birde karakter yöneticisine ihtiyacımız olacak.Bu

yönetici içinde gösterilecek olan içiriğin düzgün görünmesi için içerik düzenlenir.

function characterhandler ($xml, $data)

{

global $level;

$data = split('n', wordwrap($data, 76 – ($level * 2)));

4-14

XML Dokümanlarının PHP ile Kullanılması

foreach ($data as $line) {

echo str
repeat(($level + 1), ' '). $line. 'n';

}

}

Bütün olay yöneticilerimiz tanımladıktan sonra XML dosyamızı çözümlemeye başlayabiliriz.

xmlparse($xml, filegetcontents('test1.xhtml'));

Tüm scriptin kodları:

1.
2. function startElement($xml
parser, $name, $attributes) {

3. print('

Encountered Start Element For:$namen');

4. }

5.

6. function endElement($xmlparser, $name) {

7. print('

Encountered End Element For:$namen');

8. }

9.

10. function characterData($xml
parser, $data) {

11. if($data != 'n') {

12.

print('

Encountered Character Data:$datan');

13. }

14. }

15.

16. function load_data($file) {

17. $fh = fopen($file, 'r') or die ('

COULD NOT OPEN FILE!');

18. $data = fread($fh, filesize($file));

19. return $data;

20. }

21. / MAIN /

22. $file = 'simple.xml';

23. $xmlparser = xmlparsercreate();

24. xml
setelementhandler($xmlparser, 'startElement', 'endElement');

25. xml
setcharacterdatahandler($xmlparser, 'characterData');

26. xmlparse($xmlparser, loaddata($file)) or

27. die ('

ERROR PARSING XML!');

27. xml
parserfree($xmlparser);

28.?>

SP LT:

Bir dizi döndürür.Eleman sayısı son parametre ile sınırlandırılabilir. lk parametre ile string

parçalara bölünür.Her parça fonksiyonun dönüş dizisinin bir elemanının karşılığıdır. kinci

parametre ise parçalara ayrılacak string tipinde değişkendir.

array split ( string pattern, string string [, int limit])


// Delimiters may be slash, dot, or hyphen

5-14

XML Dokümanlarının PHP ile Kullanılması

$date = '04/30/1973';

list($month, $day, $year) = split('[/.-]', $date);

echo 'Month: $month; Day: $day; Year: $year
n';

?>

$date değişkeni slash nokta ya da tire karakteri ile parçalara ayrılır ve her parça dönüş

dizisindeki bir elemana atanır.Sonra bu dizinin elemanları sırası ile $month,$day ve $year

değişkenlerinde saklanır ve ekrana yazdırılır.Bu örnekteki materyal olan string düzenli bir

ifade kullanılarak parçalara yarılmıştır.

Document Object Model(D.O.M)

SAX metodu ile xhtml veya xml dokümanlarını çözümleme işlemi için çok kod yazmamız

gerekir.DOM metodu çok daha basittir fakat bunun bir bedeli vardır –bellek kullanımı.Fakat

böyle olmakla beraber bizim küçük örneğimiz için bu dikkate alınmayabilir.Fakat dosya

20MB büyüklüğünde olduğunda DOM metodunu kullanırken buna kesinlikle dikkat

etmeliyiz.DOM XML dosyanız içindeki her bir elementin ateşlenen olayı için bellekte bir

ağaç yapısı oluşturur.

Biz tree nesnesi boyunca yürüyerek taglar olmadan tüm içeriği gösterebiliriz.

1
2 $dom = new DomDocument();

3 $dom->load('test2.xml');

4 $root = $dom->documentElement;

5

6 processchildren($root);

7

8 function process
children($node)

9{

10 $children = $node->childNodes;

11

12 foreach ($children as $elem) {

13 if ($elem->nodeType == XMLTEXTNODE) {

14 if (strlen(trim($elem->nodeValue))) {

15 echo trim($elem->nodeValue).'n';

16 }

17 } else if ($elem->nodeType == XMLELEMENTNODE) {

18 process_children($elem);

19 }

20 }

21 }

22 ?>

Taglara ait olan attribute değerlerini elde etmek için getattribute metodu kullanılır.Bu metot

domelement sınıfına aittir.

$elem->getAttributeNode('background');

6-14XML Dokümanlarının PHP ile Kullanılması


$dom = new DomDocument();

$dom->load('test2.xml');

$body = $dom->documentElement->getElementsByTagName('body')->item(0);

echo $body->getAttributeNode('background')->value. 'n';

?>

Belirli

bir

elementinin

attribute

değerini

elde

etmek

için

$tagismi=getElementsByTagName(‘tag

ismi’)->item(0);

ile

element

elde

edilir.getAttributeNode(‘attribute
ismi’)->value; ile elemente ait olan attribute değeri elde

edilir.

Creating Dom Tree

DOM uzantısı XML dosyasını çözümlemekten daha fazlasını yapabilir.Bu uzantı ayrıca bir

XML doküman yaratabilir.Kodun içerisinden bir nesne ağacı oluşturabilirsin ve bunu bir xml

dosyası olarak diskte saklayabilirsin.


$dom = new DomDocument();

$html = $dom->createElement('html');

$html->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');

$html->setAttribute('xml:lang', 'en');

$html->setAttribute('lang', 'en');

$dom->appendChild($html);

$head = $dom->createElement('head');

$html->appendChild($head);

$title = $dom->createElement('title');

$title->appendChild($dom->createTextNode('XML Example'));

$head->appendChild($title);

/ Create the body element /

$body = $dom->createElement('body');

$body->setAttribute('backgound', 'bg.png');

$html->appendChild($body);

/ Create the p element /

$p = $dom->createElement('p');

$body->appendChild($p);

/ Add the 'Moved to' /

$text = $dom->createTextNode('Moved to ');

$p->appendChild($text);

/ Add the a /

$a = $dom->createelement('a');

$a->setAttribute('href', 'http://example.org/');

$a->appendChild($dom->createTextNode('example.org'));

$p->appendChild($a);

/ Add the '.', br and 'foo & bar' /

$text = $dom->createTextNode('.');

$p->appendChild($text);

$br = $dom->createElement('br');

$p->appendChild($br);

$text = $dom->createTextNode('foo & bar');

7-14

XML Dokümanlarının PHP ile Kullanılması

$p->appendChild($text);

echo $dom->saveXML();

?>

DomDocument sınıfı new DomDocument ile yaratılır.createElement çağrısı ile bütün

elementler oluşturulur.COMMUNICATING WITH XML

Uygulamalar bir çok yolla internet yolu ile haberleşirler.Bunların bir çoğunu zaten

biliyorsunuz.TCP/IP ve UDP/IP kullanılır fakat bunlar düşük seviyeli aktarım

protokolleridir.Sistemler arasında haberleşme zordur. Bunu sebebi sistemlerin hafızaları

içinde tutukları datayı farklı metotlar ile saklamalarınıdır.Başka bir nokta ise insanların

platformlar arasında sağlam ve güvenilir bir teknoloji istemesidir.Bir çözüm :RPC(Remote

Procedure Calls)Fakat bu metodu kullanmak kolay değildir çünkü Windows sistemlerdeki

tanımlama Unix sistemlerden faklıdır.XML genellikle en iyi çözümdür.XML farklı

platformlar üstündeki uygulamaların standart bir formatı kullanarak haberleşmesini olanaklı

kılar.XML ASCII datadır.Bu yüzden sistemler arasındaki farklılık minimize edilmiştir.Diğer

bir fark iki sistemin farklı tarih gösterimleidir : Dec 25 16:58:40 CET 2002, Wed 2002-12-25.XML-RPC

ve SOAP XML tabanlı protkoldür.SOAP geniş bir protokoldür ve özellikle haberleşme için

tasarlanmıştır.XML –RPC

XML-RPC istek ve yanıt protokolüdür.Sunucuya tapılan her request

bir response

döndürür.Response geçerli bir yanıt olabileceği bir hata da olabilir.Request ve Response

paketleri bir XML olarak kodlanır.Paketler içindeki değerler farklı imler( ,
/>...) ile kodlanır. XML-RPC şartnamesinde bir takım tipler tanımlanır.Veriler bu tiplere

dönüştürülerek taşınırlar.

XML-RPC Type Description Example Value

or Four-byte signed integer -8123

0 (false) or 1 (true) 1

ASCII string Hello world

Double-precision signed

floating-point number

91.213

Date/time 200404021T14:08:55

Base 64-encoded binary eW91IGNhbid0IHJlYWQgdGhpcyE

Bir değer iletildiğinde o imi içine yazılır. Aşağıdaki gibi

20021221R14:12:81

Bileşik veriler imi ile tanımlanırlar.Bu im ile tanımlanan veriler ilişkisel değildirler

lişkisel dizleri için imi kullanılır.





1

Hello!

8-14

XML Dokümanlarının PHP ile Kullanılması





Göründüğü gibi 1 ve Hello! Değeri imi içindedir.Bu im iminin çocuk

imidir.Bundan başka imi değerler ile ilişkili bir anahtara sahiptir.Böylelikle XML

dokümanı biraz daha karmaşık bir yapıda gözükür.





key-een

1





key-zwei

2





Request ve Response içinde datalar farklı özel imlerin içindedirler .

RESPONSE

XML-RPC içindeki Request http sunucusu üzerindeki normal POST requestidir. Fakat bazı

özel ilavler vardır.





hello





Derick







Her bir RPC request çağrısı iminden meydana gelir.Bunu metot ismi imi

takip eder bu im uzak metot ismini belirtir. Her bir parametre param elementi içine

geçirilir.Param imleri params imi ile gruplandırılır.Params elementi metot ismini belirten imin

alt imidir.Bu XML-RPC paketi hello uzak fonksiyonunu çağırır ve Deric parametresini

geçirir.RESPONSE

Fonksiyon çağrısından sonra bir XML- RPC response çağırıcı programa döndürülür.Bu

response XML olarak kodlanmıştır.Burada temel olarak iki tip response ile

karşılaşılabilir.Normal response veya bir hatayı bildiren response.

Normal bir response iminin alt imi olan ile ayır

edilebilir.Başarılı bir metodResponse her zaman bir alt imine sahiptir.Bu im ise

her zaman bir alt elementine sahiptir.Fonksiyonun içinden birden fazla değer

döndüremezsin .Fakat bir yada imi döndürebilirsin.Bir önceki bölümün

içindeki requeste ait olan sonucu metodResponse gösterir.

9-14

XML Dokümanlarının PHP ile Kullanılması









Hi Derick!







Fault

Bütün istekler(request) normal bir yanıt(response) döndürmezler ve her şey beklenildiği gibi

çalışmayabilir.Her şey istenildiği gibi çalışmadığı zaman bir imi döndürülür.Bu im

elementinin yerine geçer. imi iki üyeye sahip bir imi içerir.Bu

üyeler faultCode ve faultString imleridir.













faultCode

3





faultString

Incorrect parameters passed to method<

string>












The Client

Bizim lokal makinemizden XML-RPC fonksiyonunu çağırmak için basit bir client script

yazacağız.Bu uygulama için XMLRPC Pear Sınıfı kullanacağız.


require
once 'XML/RPC.php';

$client = new XMLRPCClient('/chap14/xmlrpcexample.php','localhost');

lk olarak XMLRPC sınıfını include edilir ve bir XMLRPC Client nesnesi hazırlanır.

Nesne Yapılandırıcısı(constructor) içindeki ilk parametre uzak makine üzerindeki XMLRPC

sunucusunun yoludur. kinci parametre ise makinenin ismidir.

10-14

XML Dokümanlarının PHP ile Kullanılması

function call
method (&$client, &$msg)

{

/ Send the request /

$p = $client->send($msg);

/ Check for an error, and print out the error message if

necessary /

if (PEAR::isError($p)) {

echo $p->getMessage();

}else {

/
Check if an XML RPC fault was returned, and display

the faultString /

if ($p->faultCode()) {

print $p->faultString();

return NULL;

} else {

/ Return the value upon a valid response /

$res = $p->value();

return $res;

}

}

}

Bir fonksiyon yazarak devam ediyoruz bu fonksiyon XMLRPC CLIENT nesnesini

kullanarak uzak fonksiyonu çağırır ve bir hata kodu dönüp dönmediğini kontrol eder.

/ Construct the parameter array /

$vals = array (

new XMLRPCValue('Derick', 'string')

);

/ Construct the message with the functionname and

the parameter array */

$msg = new XMLRPCMessage('hello', $vals);

/ Send the message and store the result in $res /

$res = callmethod($client, $msg);

/* If the result is non-null, decode the XML
RPC_Value into a PHP

variable and echo it (we assume here that it returns a

string */

if ($res !== NULL) {

echo XMLRPCdecode($res).'n';

}

XMLRPC fonksiyonunu daha önce tanımladığız fonksiyon ile çağırırız.Bundan önce bu

fonksiyona geçirilecek olan parametreler düzenlenir.Parametreler için tipler tanımlanır.

Fonksiyona parametrelerin tipleri açık yada dolayalı olarak geçiririz.XML
RPCMessage

nesnesinde fonksiyon adını , fonksiyona geçilecek parametrenin değer ve tipini belirten

parametreyi belirtiriz.

11-14

XML Dokümanlarının PHP ile Kullanılması

XML
RPCValue nesnesini kullanmak yerine XMLRPC_encode() çağrısı ile PHP

değiken tiplerini en uygun XML-RPC değişken tiplerine dönüştüren fonksiyonu da

kullanabilir.

Aşağıdaki örnek iki double değişkenini adds fonksiyonuna geçer ve bu fonksiyon ise iki

sayıyı toplayıp bir sonuç döndürür.

/ Somewhat more example with explicit types and multiple parameters /

$vals = array (

XMLRPCencode(80.9),

XMLRPCencode(-9.71)

);

$msg = new XMLRPCMessage('add', $vals);

$res = callmethod($client, $msg);

echo XML
RPCdecode($res).'n';

XML
RPCdecode fonksiyonu XMLRPCencode fonksiyonunun tam teri

yapar.XML
RPC tiplerinden uygun PHP tiplerine değişkenlerin tiplerini dönüştürür.

işlemRETROSPECTION

Internet üzerinde bir yerde XML-RPC sunucusu ile karşılaşırsan hangi fonksiyonun

kullanabileceğini öğrenmek isteyebilirisin.XML-RPC desteklene fonksiyonları bulur bu size

server üzerinde fonksiyon çağrısı için gerek tüm bilgileri sunar.Retrospection olarak

adlandırılır.’system.listMethods’ fonksiyonu ile bir dizi elde edebilirisin.Bu dizi bütün dış

fonksiyonları içerir.

/ Complex example which shows retrospection /

$msg = new XMLRPCMessage('system.listMethods');

$res = callmethod($client, $msg);

foreach (XML
RPCdecode($res) as $item) {

$vals = array (XML
RPCencode($item));

$msg = new XML
RPCMessage('system.methodHelp', $vals);

$desc = XML
RPCdecode(callmethod($client, $msg));

$msg = new XMLRPCMessage('system.methodSignature', $vals);

$sigs = XMLRPCdecode(call_method($client, $msg));

$siginfo = '';

foreach ($sigs[0] as $sig) {

$siginfo .= $sig. ' ';

}

echo '$itemn'. wordwrap($desc). 'nt$siginfonn';

}

?>SERVER

Server yazmak bir client yazmaktan daha zor değildir.XML/RPC.php dosyasını eklemek

yerine, sunucu fonksiyonlarını yerine getiren server.php dosyasını ekleyeceğiz.

getValues: Bu metodu bir dizi döndürür .Bu dizinin her parametresi fonksiyona geçirilir.

XMLRPCdecode:Her eleman XML RPC tipinden PHP tiplerine dönüştürülür.

12-14

XML Dokümanlarının PHP ile Kullanılması

Biz basitçe bir XMLRPCValues nenesi döndürürüz.Bu nesne string tipinde bir sonuç içirir.

Fonksiyonların dışarıdan elde edilebilir olması için bunları tanımalıyız. Fonksiyona geçirilen

parametreler fonksiyon ismi fonksiyon açıklaması bir dizi içine yerleştirmeliyiz.Her

fonksiyon için ayrı dizler oluşturulur.Tanımlanmış fonksiyonların elde edilebilir olması için

hazır XMLRPC sınıfını kullanırız.Bu sınıfın kurucusu istekleri(request) ve fonksiyon

çağrılarını çözümler.

Client Script Kodları:


//istemci

$path=$
SERVER['DOCUMENTROOT'];

$path=$path.'/../php/pear/XML/RPC.php';

require $path;

$client=new XML
RPCClient('/server/myserver.php','localhost');

function call
method(&$client, &$msg)

{

/ Send the request /

$p = $client->send($msg);

$res = $p->value();

return $res;

}

echo 'Siniftan nesne üretildi ve foksiyon tanimlandi.';

$msg = new XMLRPCMessage

('hello', array(new XMLRPCValue('Wild Bison', 'string')));

$res = callmethod($client, $msg);

if ($res == NULL) {

echo 'deger yok';

}else echo XML
RPCdecode($res).'n';

echo '
iki sayinin toplami:
';

$vals=array(

XML
RPCencode(14.0),

XML
RPCencode(20.2),

);

$msg=new XML
RPCMessage('add', $vals);

$res=call
method($client,$msg);

echo XMLRPCdecode($res);

?>

Server Script Kodları:


$path=$_SERVER['DOCUMENTROOT'];

$path=$path.'/../php/pear/XML/RPC/Server.php';

require($path);

function hello($args)

{

$val=$args->getParam(0);

$val=$val->scalarval();

13-14

XML Dokümanlarının PHP ile Kullanılması

$val='Hi $val !';

return new XML
RPCResponse(new XMLRPCValue($val, 'string'));

}

function add($args)

{

$val0=$args->getParam(0);

$val0=$val0->scalarval();

$val1=$args->getParam(1);

$val1=$val1->scalarval();

return new XML
RPCResponse(new XMLRPC_Value($val0+$val1,'double'));

}

$method = array(

'hello'=>array( 'function'=>'hello',

'signature'=>array( array($GLOBALS['XMLRPCString'], $GLOBALS['XMLRPCString'])),

'docstring' =>'Greets you.'),

'add'=>array( 'function'=>'add',

'signature'=>array(

array($GLOBALS['XMLRPCDouble'],$GLOBALS['XMLRPCDouble'],$GLOBALS['XMLRPCDouble'])),

'doc string'=>'iki sayiyi toplar'));

$server = new XMLRPCServer($method);

?>

Kaynak: http://www.gncz.net/xml-dokumani-nedi...
İçeriğin Devamı Aşağıda
BU İÇERİĞE EMOJİYLE TEPKİ VER!
0
0
0
0
0
0
0
ONEDİO ÜYELERİ NE DİYOR?
Yorum Yazın