Xml dökümanı nedir ?
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');
xmlsetcharacterdatahandler($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'. strrepeat(' ', $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 strrepeat(' ', $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 strrepeat(($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($xmlparser, $name, $attributes) {
3. print('
Encountered Start Element For:$namen'); Encountered End Element For:$namen');
4. }
5.
6. function endElement($xmlparser, $name) {
7. print('
8. }
9.
10. function characterData($xml
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!'); ERROR PARSING XML!');
18. $data = fread($fh, filesize($file));
19. return $data;
20. }
21. / MAIN /
22. $file = 'simple.xml';
23. $xmlparser = xmlparsercreate();
24. xmlsetelementhandler($xmlparser, 'startElement', 'endElement');
25. xmlsetcharacterdatahandler($xmlparser, 'characterData');
26. xmlparse($xmlparser, loaddata($file)) or
27. die ('
27. xml
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 processchildren($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(‘attributeismi’)->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(
dönüştürülerek taşınırlar.
XML-RPC Type Description Example Value
floating-point number
91.213
Bir değer iletildiğinde o
Bileşik veriler
lişkisel dizleri için
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
imidir.Bundan başka
dokümanı biraz daha karmaşık bir yapıda gözükür.
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.
Her bir RPC request çağrısı
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
edilebilir.Başarılı bir metodResponse her zaman bir
her zaman bir alt elementine sahiptir.Fonksiyonun içinden birden fazla değer
döndüremezsin .Fakat bir
içindeki requeste ait olan sonucu metodResponse gösterir.
9-14
XML Dokümanlarının PHP ile Kullanılması
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
üyeler faultCode ve faultString imleridir.
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.
requireonce '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 callmethod (&$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 XMLRPC_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.XMLRPCMessage
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ı
XMLRPCValue nesnesini kullanmak yerine XMLRPC_encode(
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 XMLRPCdecode($res).'n';
XMLRPCdecode fonksiyonu XMLRPCencode fonksiyonunun tam teri
yapar.XMLRPC 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 (XMLRPCdecode($res) as $item) {
$vals = array (XMLRPCencode($item));
$msg = new XMLRPCMessage('system.methodHelp', $vals);
$desc = XMLRPCdecode(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 XMLRPCClient('/server/myserver.php','localhost');
function callmethod(&$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 XMLRPCdecode($res).'n';
echo '
iki sayinin toplami:
';
$vals=array(
XMLRPCencode(14.0),
XMLRPCencode(20.2),
);
$msg=new XMLRPCMessage('add', $vals);
$res=callmethod($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 XMLRPCResponse(new XMLRPCValue($val, 'string'));
}
function add($args)
{
$val0=$args->getParam(0);
$val0=$val0->scalarval();
$val1=$args->getParam(1);
$val1=$val1->scalarval();
return new XMLRPCResponse(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);
?>
Yorum Yazın