PHP İle XML İşlemleri

PHP dili ile ilgili yazıdığım örnekler esasında WordPress çerçevesinde ilerlemekte. Ancak, WordPress dışında da yeri geldiğinde PHP yeteneklerinden sıklıkla faydalandığımı belirtmeliyim. Bu yazıda temel bir şekilde PHP ile XML (EXtensible Markup Language / Genişletilebilir İşaretleme Dili) dosyalarını nasıl okuyabileceğimize bakacağız. Bir sonraki aşamada da okuduğumuz bu XML içeriğini farklı bir amaçla değerlendireceğiz.

Örnek olarak şöyle bir senaryoları ele alabiliriz…

  • Bayisi olduğumuz farklı tedarikçilerin ürünlerini sitemize entegre etmek isteyebiliriz.
  • Sitemizde yer alan ürünleri gittigidiyor, amazon, akakçe hepsiburada, n11 gibi pazaryerlerine de otomatik bir şekilde eklemek/yönetmek isteyebiliriz.
  • Muhasebe programı ile websitesini ilişkilendirmek isteyebiliriz.

Yukarıdaki örnekleri daha da çeşitlendirmek mümkün. Ancak, görüldüğü üzere temlede yer alan neden sistemlerin kolaylıkla haberleşebilmesini sağlamak. REST API de yine bu ihtiyaçlar çerçevesinde değerlendirilebilir. Burada dikkat edilmesi gereken husus haberleşecek yapıların uyumlu ve kesintisiz bir şekilde haberleşebilmesini sağlamak.

PHP XML işlemlerinde aşağıdaki basitleştirilmiş yapıyı ele alacağım. Örnek XML dosyasını tüm detaylarıyla görüntülemek için (varyasyon, özelleştimeler vb. alanlarla birlikte) İdeasoft XML Örnekleri1 sayfasını inceleyebilirsiniz.

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <item>
  <stockCode></stockCode>
  <label></label>
  <status></status>
  <price1></price1>
  <stockAmount></stockAmount>
  <picture1Path></picture1Path>
 </item>
</root>

PHP XML İşleme: Oluşturma

PHP dili ile XML işlemleri gerçekleştirmek istediğimizde SimpleXML, XMLReader, XMLWriter, DOMDocument gibi çözümlerden faydalanabilmekteyiz2. Bu çözümler temel olarak benzerlikler taşısalar da sahip oldukları fonksiyonların farklı çözümlere odaklandıklarını görebilirsiniz. Ben pratikliği ve zenginliği sebebiyle DOMDocument sınıfını kullanacağım3. O halde ilk olarak header ile üzerinde çalıştığımız *.php uzantılı dosyanın XML dosyası olarak değerlendirilmesini sağlayalım4.

header('Content-Type: application/xml;', 'UTF-8');

Artık XML dökümanımızın sürüm (1.0) ve karakter setini (UTF-8) tanımlayabiliriz.

$xmlDoc = new DOMDocument('1.0', 'UTF-8');

Bundan sonraki aşamamız DOM ağacının örülmesi. root > item ana yapımızı oluşturmakta. item ise her birini temsil eden detayları barındırmakta.

// elements
$root = $xmlDoc->createElement('root');
$item = $xmlDoc->createElement('item');
$stockCode = $xmlDoc->createElement('stockCode', 'ABC001');
$label = $xmlDoc->createElement('label', 'Lemur Pro 14"');
$status = $xmlDoc->createElement('status', 'instock');
$price1 = $xmlDoc->createElement('price1', 1099);
$stockAmount = $xmlDoc->createElement('stockAmount', 5);
$picture1Path = $xmlDoc->createElement('picture1Path', 'https://alanadi.com/gorsel.jpg');

Şimdi oluşturduğumuz bu detayları item bağlamında toplayalım.

// append
$xmlDoc->appendChild($root);
$root->appendChild($item);

$item->appendChild($stockCode);
$item->appendChild($label);
$item->appendChild($status);
$item->appendChild($price1);
$item->appendChild($stockAmount);
$item->appendChild($picture1Path);

Son adımda artık oluşturduğumuz bu yapıyı php dokümanımız aracılığıyla görüntüleyebiliriz.

// result
print $xmlDoc->saveXML();

Oluşturduğumuz bu yapıyı artık uyumlu sistemlerle entegre edebiliriz.

PHP XML İşleme: Okuma

Oluşturduğumuz bu XML dosyasını okuyalım. Yine bir *.php dosyası oluşturalım. Ardından, XML dosyasının linki ve okuyacağımız XML dosyasının sürüm ve karakter setini belirtelim5.

$url = 'https://alanadi.com/xml/ideasoft.xml';
if(!$testXML = file_get_contents($url)){
  trigger_error('XML dosyasını okurken hata meydana geldi.');
}
$xmlDoc = new DOMDocument('1.0', 'utf-8');

$xmlDoc tüm işlemlerde kullanacağımız ve XML dökümanını temsil eden değişkenimiz. Bir sonraki aşamada bu değişkenin barındırdığı içeriği XML olarak okuyalım.

$xmlDoc->loadXML($testXML);

Evet, artık XML içeriğimiz hazır. Yukarıda XML dosyası oluşutururken de bahsi geçtiği üzere her ürün item olarak temsil edilmekte ve ürün detayları bu kapsayıcı etiket içerisinde label, status, stockCode, price1 ve picture1Path etiketleri ile işaret edilmekte. O halde, önce item etiketine ulaşalım6.

$searchNode = $xmlDoc->getElementsByTagName('item');

Bir listeleme (ul li) yaparak ürün bilgilerimizi listeleyebiliriz. Bir array ile önceden anahtar (key) ve değerleri (value) belirtebiliriz ya da satır satır kendimiz de ilgili alanları belirtebiliriz.

$i = 1;
$itemChilds = array(
  'Ürün Adı' => 'label',
  'Fiyat' => 'status',
  'Stok Adedi' => 'stockAmount',
  'SKU' => 'stockCode',
  'Fiyat' => 'price1',
  'Görsel' => 'picture1Path'
);

Şimdi bir döngü ile değerlerimizi (atomic value) listeleyelim.

foreach($searchNode as $searchNode) {
  echo '<ul>';
  echo '<li>'.$i.'</li>';
  foreach($itemChilds as $key => $value){
    echo '<li>'.$key.': '.$searchNode->getElementsByTagName($value)->item(0)->nodeValue.'</li>';
  }
  echo '</ul>';
  $i++;
}

Az önce de belirttiğim gibi, bir dizi (array) yerine döngü içerisinde etiket ve içeriğini aşağıdaki gibi satır satır da belirtmemiz mümkün.

$xmlStatus = $searchNode->getElementsByTagName('status');
$valueStatus = $xmlStatus->item(0)->nodeValue;

İleri Okumalar