Skip to content

PHP ile XML Dosyayı İşlemek

XML(Extensible Markup Language) bilgilerinizi dallandırılmış halde saklamak için kullanılır. Genellikle uygulamalar arasında bilgi paylaşımı yapmak için kullanılır aynı zamanda RSS beslemeleride XML ile yapılmaktadır.

PHP 5’in ortaya çıkmasıya XML işleme desteği muhteşem bir şekilde arttı. Bu makale ile bizde PHP ile XML dökümanı işleme, değiştirme ve XML döküman oluşturma işlemlerini öğrenmiş olacağız. Makalenin en altında RSS beslemelerinin nasıl yapıldığını göreceğiz ve aynı zamanda basit bir RSS besleme okuyucusu hazırlamış olacağız.

Bu makaleyi tam anlamıyla kavrayabilmek için nesne tabanlı programlamaya hakim olmanız gerekiyor. Ayrıca XPath terimini biraz araştırmanız da fayda var. Çünkü bu makalede kullanacağız fakat olmasada olurlardan. O zaman başlayalım…

Parsing XML
PHP 5 SimpleXML isimli kullanımı basit olan bir sınıfa sahiptir.

Bu makale boyunca makaleler.xml adlı bir dosya oluşturdum ve trkodlama.com’da seçilmiş rastgele bir kaç makaleyi ekledim

<?xml version="1.0"?>
<makaleler>
  <makale id="1">
    <baslik>PHP Dersleri 1</baslik>
    <giris>Echo komutu</giris>
  </makale>
  <makale id="2">
    <baslik>PHP Dersleri 2</baslik>
    <giris>Degiskenler</giris>
  </makale>
  <makale id="3">
    <baslik>PHP Dersleri 3</baslik>
    <giris>Kendi fonksiyonumuzu olusturalim</giris>
  </makale>
</makaleler>

Şimdi PHP dosyamız ile XML dosyasını iki türlü işleme alabiliriz. Ya içeriği komple çekeriz ya da dosyanın yerini gösteririz:

<?php
// İçeriği çekelim
$veri = file_get_contents('makaleler.xml');
$makaleler = SimpleXMLElement($veri);
//-------------------
// Dosyanın yerini gösteririz
$makaleler = SimpleXMLElement('makaleler.xml', null, true);
?>

Eğer makaleler.xml dosyası kendi sunucunuzda bulunuyorsa file_get_content() kullanamaya hiç gerek yoktur. file_get_contents() fonksiyonu ile çağırma işlemini sadece farklı web sunucularından XML dosya çekmek zorundaysak kullanmamız en temizi ve güzeli olurdur.

Dosyayı yüklemenin bir başka yöntemi ise simplexml_load_file() fonksiyonunu kullanmaktır. Bunu da şu şekilde gerçekleştirebiliriz:

$makaleler = simplexml_load_file('makaleler.xml');

Şimdi XML dosyamızdaki verileri HTML tabloya yazdıralım

<?php
// SimpleXML
$makaleler = new SimpleXMLElement('makaleler.xml', null, true);

echo <<<EOF
    <table>
        <tr>
			<th>ID</th>
            <th>Başlık</th>
            <th>Giriş</th>
        </tr>
EOF;
foreach($makaleler as $makale){
        echo <<<EOF
            <tr>
                <td>{$makale['id']}</td>
                <td>{$makale->baslik}</td>
                <td>{$makale->giris}</td>
            </tr>
        EOF;
}
echo '</table>';
?>

Bu işlemin HTML çıktısı aşağıdaki gibi olacaktır:

<table>
        <tr>
                <th>ID</th>
                <th>Başlık</th>
                <th>Giriş</th>
        </tr>
        <tr>
				<td>1</td>
                <td>PHP Dersleri 1</td>
                <td>Echo komutu</td>
        </tr>
        <tr>
                <td>2</td>
                <td>PHP Dersleri 2</td>
                <td>Degiskenler</td>
        </tr>
        <tr>
                <td>3</td>
                <td>PHP Dersleri 3</td>
                <td>Kendi fonksiyonumuzu olusturalim</td>
        </tr>
</table>

Peki siz makalelerden sadece ikinci makalenin başlığını çekmek istiyorsunuz. O zaman şöyle yaparız(dizilerde sayma işleminin 0’dan başladığını hatırlayın)

echo $makaleler->makale[1]->baslik;

Aynı makalenin ID’sini şu şekilde çekiyoruz:

echo $makaleler-&amp;gt;makale[1]['id'];

XPath
Aynı zamanda Xpath sorgularını da çalıştırabilirsiniz. SimpleXMLElement::xpath() methodunu kullanarak çalışırlar. Eğer bütün makalelerin başlıklarını çekmek istersek aşağıdaki gibi birşey yapabiliriz:

<?php
$basliklar = $makaleler->xpath('makale/baslik');
foreach($basliklar as $baslik)
{
        echo $baslik.PHP_EOL;
}
?>

Ya da bütün ID’leri çekmek için:

<?php
$id = $makaleler->xpath('makale/@id');
foreach($id as $id){
    echo $id.PHP_EOL;
}
?>

RSS Beslemelerini İşleme
Şimdi www.trkodlama.com/rss.php adresinden verileri alalım:

<?php
$rss = new SimpleXMLElement('http://www.trkodlama.com/rss.php', null, true);

echo "<h1><a href='{$rss->channel->link}'>{$rss->channel->title}</a></h1>".PHP_EOL.'<hr />'.PHP_EOL;

foreach($rss->xpath('channel/item') as $item){
    echo <<<EOF
        <h2><a href='{$item->link}'>{$item->title}</a></h2>
        <div>Gönderilme Zamanı: {$item->pubDate}</div>
        {$item->description}
        <hr />
    EOF;
}
?>

Bu size sayfanın başında söylediğim RSS besleme okuyucumuz. Bu okuyucumuzu daha da geliştirmek için biraz AJAX kullanın ve arayüzü şık bir hale getirin.

Gördüğünüz gibi XML bilgiyi işleme XML dosyanın yapısını bildikten sonra SimpleXML ile oldukça basit. Peki yapısını bilmediğiniz bir XML’i işleme almak için ne yapmalısınız? O zaman aşağıdaki işlemleri inceleyin. Fakat hala makaleler.xml dosyamızı kullanmaya devam edeceğiz.

<?php
function isle(SimpleXMLElement $element, $level = 0)
{
    $indent     = str_repeat("t", $level);

    $deger      = trim((string) $element);  // değeri çek ve başlangıç-bitiş arasındaki bütün boşlukları sil
    $parametreler = $element->attributes();   // bütün parametreleri çek
    $children   = $element->children();     // children(türkçe ne olarak söylenir bilmiyorum)'ları çek

    echo "{$indent}Parsing '{$element->getName()}'...".PHP_EOL;
    if(count($children) == 0 && !empty($deger)) // Değer doluysa ve children'ı yoksa göster
    {
        echo "{$indent}Değer: {$element}".PHP_EOL;
    }

    // parametre var ise göster
    if(count($parametreler) > 0){
        echo $indent.' deki '.count($parametreler).' parametre:'.PHP_EOL;
        foreach($parametreler as $parametre){
            echo "{$indent}- {$parametre->getName()}: {$parametre}".PHP_EOL;
        }
    }

    if(count($children)){
        echo $indent.' deki '.count($children).' children:'.PHP_EOL;
        foreach($children as $child){
            isle($child, $level+1);
        }
    }
    echo $indent.PHP_EOL; // daha temiz hale getirmek için
}

$xml = new SimpleXMLElement('makaleler.xml', null, true);

isle($xml);

Not: Eğer bunu bir tarayıcıda çalıştırmak isterseniz header(‘Content-type: text/plain’); kodunu ekrana herhangi bir çıktı vermeden önce kullanmalısınız. Böylece tarayıcı bunun sadece bir text olduğunu ve HTML içermediğini anlayacaktır.

Aslında SimpleXML’den çok daha güçlü bir XML işleyicimiz var. Adı da PHP DOM fakat buna şimdi değinmiyorum. Çünkü bende çok iyi bilmiyorum. PHP DOM’u iyice sindirdikten sonra sizler sunarım.

Umarım faydalı ve akıcı bir anlatım olmuştur. Sorularını forumdan, iletişim formundan veya yorum olarak sorabilirsiniz.

Kolay gelsin,

TR Kodlama GitHub'da!

TR Kodlama'da yer alan makaleleri GitHub üzerinden düzenleyebileceğinizi biliyor muyudunuz? Harika değil mi? Bu makale ile ilgili düzenleme yapmak isterseniz aşağıdaki butona tıklayınız!

GitHub'da Görüntüle ve Düzenle!