PHP – XML

GİRİŞ

XML platformlar arası bir haberleşme dili olarak daha hızlı evrensel bir dildir. Xml

bazılarına göreyse yeni bir web devrimidir.XML bazen dokümanları depolamak amacı ile bir

veri tabanı olarak kullanılır.Fakat XML nin temel amacı veri depolamak değildir.XML in

geliş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 Web

consortium(w3c) tarafından tanımlanmış bir standarttır. XML hakkında bilgiye ve onunla

ilişkili teknolojiler http://www.w3.org/XML adresinden bulunabilir.

VOCABULARY

XML dokümanları ile çalışırken bir çok bilinmeyen terim ile karşılaşabilirsiniz.Aşağıdaki

örnek bir xml dokümanını gösterir o bir xhtml dokümanıdır.

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE html

PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”

“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>

<head>

<title>XML Example</title>

</head>

<body background=”bg.png”>

<p>

Moved to <a href=”http://example.org/”>example.org</a>.

<br />

foo &amp; bar

</p>

</body>

</html>

lk satır XML bildirimidir.xml versiyonunu ve xml encode dosyasını belirtir.Bu satır <? le

başlar.Bu dosyayı

bir PHP scripti olarak kullanırsanız bir problem ortaya çıkabilir.Eğer

php.ini dosyanızda shor_open_tag=On ayarına sahipseniz ki bu bir varsayılan ayardır.PHP bu

karakter kombinasyonunu gördüğünde(<? ) bunun bir php bölümü açılışı olduğunu sanar.Eğer

1-14

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

XML ile çalışırken bu şekilde bir problemle karşılaşmak istemiyorsanız PHP shor_open_tag

ayarını off yapınız.

XML bildirisinden sonara 3 satır boyunca DOCTYPE bildirisni görürüz.Bu bildiri < > içinde

yazılır.Bu kısım XML içindeki ana tagın <html> olduğu bildirilir. PUBLIC “-//W3C//DTD

XHTML 1.0 Transitional//EN” bildirisi dokümanın tipini bildirir ve Doküman Tip Tanımının

(Document Type Defination) http://www.w3.org/TR/xhtml1/DTD/ /xhtml1-transitional.dtd

adresinde bulanabileceği bildirilir.Bir DTD dosyası bir dokümanın tip yapısını tanımlar.

Dokümanının geri kalanı içeriğin kendisinden meydana gelir ve root element ile başlar ayrıca

ana düğüm olarak ta adlandırılır.

<html

xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>

XHTML 1.0 Transitional DTD ye göre root element bir xmls bildirisi içerir XHTML

namespace si için.Bir namespace iki ayrı doküman tipinin bir varlıkta birleşimini bir XML

içinde bulunmasını sağlar.Örnek olarak XHTML içinde gömülü olan MatML

Root elementinin çocuk düğümleri

<head>

<title>XML Example</title>

</head>

<body background=”bg.png”>

<p>

Moved to <a href=”http://example.org/”>example.org</a>.

<br />

foo &amp; bar

</p>

</body>

The head tags (<head>and</head>) enclose the nested title tag that specify the title XML

Example.

Head tagları başlık tagınını(title) çevir title tagı XML örneğinin başlığını bildirir.

Body tagı arkapalanın(backgraund) niteliklerini içerir. Attribute belirli bir tag hakkında ilave

bilgiler içirir.XML standartları bir değere sahip olamak için bütün attributeleri ister.Attribute

için bir değer çift veya tek tırnek işareti içinde verilmelidir.Xml dökümanın başından sonuna

değin tek tırnak kullanılması tavsiye edilir fakat bu bir zorunluluk değildir.Bu örnekte

background attribute bir background resmi belirtir bu resim bg.png dosyası içinde bulunur.

Bütün açık(<p>) taglar uygun bir kapanış tagına ihtiyaç duyar örneğin </p>

Bir element içeriğe sahip olamaz. çeriği tagların arasına yerleştirirsiniz.

2-14

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 &lt; kombinasyonunu ve < karakterini göstermek içinse

&gt; 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 &euro; ve &euml; dir. http://www.w3.org/

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

&amp;

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 = xml_parser_create(‘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.

xml_set_element_handler($xml, ‘start_handler’, ‘end_handler’);

xml_set_character_data_handler($xml, ‘character_handler’);

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.

xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, false);

function start_handler ($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 end_handler ($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 character_handler ($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.

xml_parse($xml, file_get_contents(‘test1.xhtml’));

Tüm scriptin kodları:

1. <?php

2. function startElement($xml_parser, $name, $attributes) {

3. print(“<p><i>Encountered Start Element For:</i>$name\n”);

4. }

5.

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

7. print(“<p><i>Encountered End Element For:</i>$name\n”);

8. }

9.

10. function characterData($xml_parser, $data) {

11. if($data != “\n”) {

12.

print(“<p><i>Encountered Character Data:</i>$data\n”);

13. }

14. }

15.

16. function load_data($file) {

17. $fh = fopen($file, “r”) or die (“<P>COULD NOT OPEN FILE!”);

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

19. return $data;

20. }

21. /***** MAIN *****/

22. $file = “simple.xml”;

23. $xml_parser = xml_parser_create();

24. xml_set_element_handler($xml_parser, “startElement”, “endElement”);

25. xml_set_character_data_handler($xml_parser, “characterData”);

26. xml_parse($xml_parser, load_data($file)) or

27. die (“<P>ERROR PARSING XML!”);

27. xml_parser_free($xml_parser);

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])

<?php

// 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<br />\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 <?php

2 $dom = new DomDocument();

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

4 $root = $dom->documentElement;

5

6 process_children($root);

7

8 function process_children($node)

9{

10 $children = $node->childNodes;

11

12 foreach ($children as $elem) {

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

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

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

16 }

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

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

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

<?php

$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

$tag_ismi=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.

<?php

$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(<array /> ,<data

/>…) 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

<i4 /> or <int /> Four-byte signed integer -8123

<boolean /> 0 (false) or 1 (true) 1

<string /> ASCII string Hello world

<double /> Double-precision signed

floating-point number

91.213

<dateTime.iso8601 /> Date/time 200404021T14:08:55

<base64 /> Base 64-encoded binary eW91IGNhbid0IHJlYWQgdGhpcyE

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

<value><dateTime.iso8601 />20021221R14:12:81</dateTime.iso8601><value>

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

lişkisel dizleri için <struct /> imi kullanılır.

<array>

<data>

<value><int>1</int></value>

<value><string>Hello!</string</value>

8-14

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

</data>

</array>

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

imidir.Bundan başka <struct /> 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.

<struct>

<member>

<name>key-een</name>

<value><int>1</int></value>

</member>

<member>

<name>key-zwei</name>

<value><int>2</int></value>

</member>

</struct>

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.

<?xml version=”1.0″?>

<methodCall>

<methodName>hello</methodName>

<params>

<param>

<value><string>Derick</string></value>

</param>

</params>

</methodCall>

Her bir RPC request çağrısı <meodCall /> 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 <metodResponse /> iminin alt imi olan <params /> ile ayır

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

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

döndüremezsin .Fakat bir <array /> yada <struct /> 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ı

<?xml version=”1.0″?>

<methodResponse>

<params>

<param>

<value><string>Hi Derick!</string></value>

</param>

</params>

</methodResponse>

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 <fault /> imi döndürülür.Bu im

<params /> elementinin yerine geçer.<fault /> imi iki üyeye sahip bir <struct /> imi içerir.Bu

üyeler faultCode ve faultString imleridir.

<?xml version=”1.0″?>

<methodResponse>

<fault>

<value>

<struct>

<member>

<name>faultCode</name>

<value><int>3</int></value>

</member>

<member>

<name>faultString</name>

<value><string>Incorrect parameters passed to method<

string></value>

</member>

</struct>

</value>

</fault>

</methodResponse>

The Client

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

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

<?php

require_once “XML/RPC.php”;

$client = new XML_RPC_Client(‘/chap_14/xmlrpc_example.php’,'localhost’);

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

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

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 XML_RPC_ 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 XML_RPC_Value(‘Derick’, ‘string’)

);

/* Construct the message with the functionname and

* the parameter array */

$msg = new XML_RPC_Message(‘hello’, $vals);

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

$res = call_method($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 XML_RPC_decode($res).”\n”;

}

XML_RPC 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_RPC_Message

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_RPC_Value nesnesini kullanmak yerine XML_RPC_encode(<value>) ç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 (

XML_RPC_encode(80.9),

XML_RPC_encode(-9.71)

);

$msg = new XML_RPC_Message(‘add’, $vals);

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

echo XML_RPC_decode($res).”\n”;

XML_RPC_decode fonksiyonu XML_RPC_encode fonksiyonunun tam teri

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

işlem

RETROSPECTION

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 XML_RPC_Message(‘system.listMethods’);

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

foreach (XML_RPC_decode($res) as $item) {

$vals = array (XML_RPC_encode($item));

$msg = new XML_RPC_Message(‘system.methodHelp’, $vals);

$desc = XML_RPC_decode(call_method($client, $msg));

$msg = new XML_RPC_Message(‘system.methodSignature’, $vals);

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

$siginfo = ”;

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

$siginfo .= $sig. ” “;

}

echo “$item\n”. wordwrap($desc). “\n\t$siginfo\n\n”;

}

?>

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.

XML_RPC_decode: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 XML_RPC_Values 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 XML_RPC 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ı:

<?php

//istemci

$path=$_SERVER['DOCUMENT_ROOT'];

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

require $path;

$client=new XML_RPC_Client(‘/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 XML_RPC_Message

(“hello”, array(new XML_RPC_Value(‘Wild Bison’, ‘string’)));

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

if ($res == NULL) {

echo “deger yok”;

}else echo XML_RPC_decode($res).”\n”;

echo “<br> iki sayinin toplami:<br>”;

$vals=array(

XML_RPC_encode(14.0),

XML_RPC_encode(20.2),

);

$msg=new XML_RPC_Message(‘add’, $vals);

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

echo XML_RPC_decode($res);

?>

Server Script Kodları:

<?php

$path=$_SERVER['DOCUMENT_ROOT'];

$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_RPC_Response(new XML_RPC_Value($val, ‘string’));

}

function add($args)

{

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

$val0=$val0->scalarval();

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

$val1=$val1->scalarval();

return new XML_RPC_Response(new XML_RPC_Value($val0+$val1,’double’));

}

$method = array(

‘hello’=>array( ‘function’=>’hello’,

‘signature’=>array( array($GLOBALS['XML_RPC_String'], $GLOBALS['XML_RPC_String'])),

‘docstring’ =>’Greets you.’),

‘add’=>array( ‘function’=>’add’,

‘signature’=>array(

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

‘doc string’=>’iki sayiyi toplar’));

$server = new XML_RPC_Server($method);

?>