SimpleXML nesnesini diziye çeviren PHP fonksiyonuPHP, XML formatındaki metin veya dosyalar üzerindeişlem yapabilmek için SimpleXML araç setini kullanıma sunmuştur. SimpleXML araç seti, XML kaynağını dahili bir nesneye çevirir ve oluşan bu nesne ile XML kaynağı üzerinde işlem yapmamızı sağlar.Yazımızın esas amacı size SimpleXML nesnesinin içeriğini PHP dizisine dönüştürmektir. Yazdığım kodu zip formatında kendi bilgisayarınıza indirip kullanabilirsiniz.

PHP de SimpleXML’i örnek kullanımı:

  1. $xmlmetin="<?xml version=’1.0′ standalone=’yes’?><kitaplar><adi>PHP ve MySQL</adi><yazar>Luke Welling</yazar></kitaplar>";
  2. $xml = new SimpleXMLElement($xmlmetin);
  3. echo $xml->kimden;

SimpleXML nesnesinin kullanımı bu kadar basittir. Burada SimpleXML’in temel kullanımını anlatmayacağım, daha detaylı bilgiye buraya tıklayarak ulaşabilirsiniz.

SimpleXML ile çalışırken, XML yapısının diziye aktarılması gerekliliğyle karşı karşıya kalmıştım. Birçok yazılmış kodu inceledikten sonra, neyazıkki hiç birisinin tam istediğimi karşılamadığını farkettim. Pes ettim ve aramaktan vazgeçtim ve kendi kodumu yazdım. Aşağıda sizinle paylaşacağım kod, SimpleXML ile oluşturulmuş nesneyi, PHP dizisine dönüştürüyor.Herşeyden önce, fonksiyona parametre olarak geçeceğiniz  değişken, geçerli bir SimpleXML nesnesi olmalıdır.  İşte SimpleXML nesnesini diziye çeviren fonkyison:

  1. /**
  2. * @desription SimpleXML nesnesini parametre olarak alan bu fonkyion, gelen SimpleXML nesnesini
  3. * diziye çevirir ve sonuç olarak bu diziyi döndürür
  4. *
  5. * @author   Orhan DOĞAN
  6. * $email    <a href="mailto:od@orhandogan.us">od@orhandogan.us</a>
  7. * @date     13.12.2007, 12:30
  8. * @param    object      $xml  SimpleXML object
  9. * @return  array
  10. */
  11. function simpleXML_to_array($xml) {
  12.     # düğümün değerinin tutlacağı dizi indisi
  13.     define(DUGUM_DEGERI,‘#V#’);
  14.     #düğümün öz niteliklerinin tutulacaüı dizi indisi
  15.     define(DUGUM_OZNITELIKLERI,‘#A#’);
  16.     $sonuc = Array();
  17.     foreach($xml->children() as $dugum => $deger_veya_altdugum) {
  18.         #çocuk nesneyi yeniden çağır (öz yinele)
  19.         $cocuk = simpleXML_to_array($deger_veya_altdugum);
  20.         #düğümün öz nitelikleri varsa NODE_ATTRIBUTES dizi indisi altında topla
  21.         foreach( $deger_veya_altdugum->attributes() as $ak => $av ) {
  22.             $cocuk[DUGUM_OZNITELIKLERI][$ak] = (string)$av;
  23.         }
  24.         if(!$cocuk[DUGUM_OZNITELIKLERI]){
  25.             $cocuk[DUGUM_OZNITELIKLERI]=;
  26.         }
  27.         if(!$cocuk[DUGUM_DEGERI]){
  28.             $cocuk[DUGUM_DEGERI] = trim((string)$deger_veya_altdugum);
  29.         }
  30.         #düğüm, dizi elemanı veya değeri olarak ekleniyor
  31.         if (!in_array($dugum,array_keys($sonuc))) {
  32.             $sonuc[$dugum] = $cocuk;
  33.         } elseif (@in_array(0,@array_keys($sonuc[$dugum]))) {
  34.             if(count($sonuc[$dugum])==2){
  35.                 if($sonuc[$dugum][DUGUM_OZNITELIKLERI] ||$sonuc[$dugum][DUGUM_DEGERI] ){
  36.                     $tmp=Array();
  37.                     $tmp[DUGUM_OZNITELIKLERI]=$sonuc[$dugum][DUGUM_OZNITELIKLERI];
  38.                     $tmp[DUGUM_DEGERI]=$sonuc[$dugum][DUGUM_DEGERI];
  39.                     unset($sonuc[$dugum][DUGUM_OZNITELIKLERI]);
  40.                     unset($sonuc[$dugum][DUGUM_DEGERI]);
  41.                     $sonuc[$dugum][0]=$tmp;
  42.                     unset($tmp);
  43.                 }
  44.             }
  45.             if(count(array_diff_key($sonuc[$dugum],$cocuk))==0 &amp;&amp; count($sonuc[$dugum])>0){
  46.                 $tmp=$sonuc[$dugum];
  47.                 unset($sonuc[$dugum]);
  48.                 $sonuc[$dugum][]=$tmp;
  49.             }
  50.             $sonuc[$dugum][] = $cocuk;
  51.         } else {
  52.             $sonuc[$dugum] = array($sonuc[$dugum]);
  53.             $sonuc[$dugum][] = $cocuk;
  54.         }
  55.     }
  56.     return $sonuc;
  57. }

Fonksiyonu içeren PHP kodunu buraya tıklayarak indirebilirsiniz. İndirdiğiniz PHP kodu dosyası, UTF-8 formatında BOM olmadan kaydedilmiştir. Dizinin örnek kullanımı ve çıktısı aşaşıdadır:

  1. <?
  2.  $xml_metin="<?xml version=’1.0′ standalone=’yes’?>
  3. <notlar>
  4.   <not>
  5.       <tarih>13.12.2007, 13:27</tarih>
  6.       <kimden>Orhan</kimden>
  7.       <kime>Ahmet</kime>
  8.       <baslik icerik=\"metin\"><![CDATA[SimpleXML koduna bir gözatar mısın?]]></baslik>
  9.       <ileti icerik=\"HTML\"><![CDATA[Abi yeni bi kod yazdım, seninde işine yarayacağını düşünüyorum, bir gözatıver…Selamlar.]]>
  10.         <tavsiye adres=\"öz nitelik 11\">tavsiye 1</tavsiye>
  11.         <tavsiye adres=\"öz nitelik 22\">tavsiye 2</tavsiye>
  12.         <tavsiye adres=\"öz nitelik 33\">tavsiye 3</tavsiye>
  13.       </ileti>
  14.   </not>  
  15.  
  16.   <not>
  17.       <tarih>13.12.2007, 14:32</tarih>
  18.       <kimden>Ahmet</kimden>
  19.       <kime>Orhan</kime>
  20.       <baslik icerik=\"metin\"><![CDATA[Cvp: SimpleXML koduna bir gözatar mısın?]]></baslik>
  21.       <ileti icerik=\"HTML\"><![CDATA[Orhan’cım kodunu inceledim ve denedim. Gayet güzel işe yarar. eline sağlık.. Selamlar]]>
  22.         <tavsiye adres=\"öz nitelik 44\">tavsiye 4</tavsiye>
  23.         <tavsiye adres=\"öz nitelik 55\">tavsiye 5</tavsiye>
  24.         <tavsiye adres=\"öz nitelik 66\">tavsiye 6</tavsiye>
  25.       </ileti>
  26.   </not>
  27. </notlar>";  
  28.  
  29. $xml = simplexml_load_string($xml_metin);
  30. $dizi=simpleXML_to_array($xml);
  31. print_r($dizi);  
  32.  
  33. ?>

Yukarıdaki fonksiyon çalıştırıldığında aşağıdaki çıktı elde edilecektir:

  1. Array  
  2.  
  3. (  
  4.  
  5.     [not] => Array  
  6.  
  7.         (  
  8.  
  9.             [0] => Array  
  10.  
  11.                 (  
  12.  
  13.                     [tarih] => Array  
  14.  
  15.                         (  
  16.  
  17.                             [#A#] =>  
  18.  
  19.                             [#V#] => 13.12.2007, 13:27  
  20.  
  21.                         )  
  22.  
  23.                     [kimden] => Array  
  24.  
  25.                         (  
  26.  
  27.                             [#A#] =>  
  28.  
  29.                             [#V#] => Orhan  
  30.  
  31.                         )  
  32.  
  33.                     [kime] => Array  
  34.  
  35.                         (  
  36.  
  37.                             [#A#] =>  
  38.  
  39.                             [#V#] => Ahmet  
  40.  
  41.                         )  
  42.  
  43.                     [baslik] => Array  
  44.  
  45.                         (  
  46.  
  47.                             [#A#] => Array  
  48.  
  49.                                 (  
  50.  
  51.                                     [icerik] => metin  
  52.  
  53.                                 )  
  54.  
  55.                             [#V#] => SimpleXML koduna bir gözatar mısın?  
  56.  
  57.                         )  
  58.  
  59.                     [ileti] => Array  
  60.  
  61.                         (  
  62.  
  63.                             [tavsiye] => Array  
  64.  
  65.                                 (  
  66.  
  67.                                     [0] => Array  
  68.  
  69.                                         (  
  70.  
  71.                                             [#A#] => Array  
  72.  
  73.                                                 (  
  74.  
  75.                                                     [adres] => öz nitelik 11  
  76.  
  77.                                                 )  
  78.  
  79.                                             [#V#] => tavsiye 1  
  80.  
  81.                                         )  
  82.  
  83.                                     [1] => Array  
  84.  
  85.                                         (  
  86.  
  87.                                             [#A#] => Array  
  88.  
  89.                                                 (  
  90.  
  91.                                                     [adres] => öz nitelik 22  
  92.  
  93.                                                 )  
  94.  
  95.                                             [#V#] => tavsiye 2  
  96.  
  97.                                         )  
  98.  
  99.                                     [2] => Array  
  100.  
  101.                                         (  
  102.  
  103.                                             [#A#] => Array  
  104.  
  105.                                                 (  
  106.  
  107.                                                     [adres] => öz nitelik 33  
  108.  
  109.                                                 )  
  110.  
  111.                                             [#V#] => tavsiye 3  
  112.  
  113.                                         )  
  114.  
  115.                                 )  
  116.  
  117.                             [#A#] => Array  
  118.  
  119.                                 (  
  120.  
  121.                                     [icerik] => HTML  
  122.  
  123.                                 )  
  124.  
  125.                             [#V#] => Abi yeni bi kod yazdım, seninde işine yarayacağını düşünüyorum, bir gözatıver…Selamlar.  
  126.  
  127.                         )  
  128.  
  129.                     [#A#] =>  
  130.  
  131.                     [#V#] =>  
  132.  
  133.                 )  
  134.  
  135.             [1] => Array  
  136.  
  137.                 (  
  138.  
  139.                     [tarih] => Array  
  140.  
  141.                         (  
  142.  
  143.                             [#A#] =>  
  144.  
  145.                             [#V#] => 13.12.2007, 14:32  
  146.  
  147.                         )  
  148.  
  149.                     [kimden] => Array  
  150.  
  151.                         (  
  152.  
  153.                             [#A#] =>  
  154.  
  155.                             [#V#] => Ahmet  
  156.  
  157.                         )  
  158.  
  159.                     [kime] => Array  
  160.  
  161.                         (  
  162.  
  163.                             [#A#] =>  
  164.  
  165.                             [#V#] => Orhan  
  166.  
  167.                         )  
  168.  
  169.                     [baslik] => Array  
  170.  
  171.                         (  
  172.  
  173.                             [#A#] => Array  
  174.  
  175.                                 (  
  176.  
  177.                                     [icerik] => metin  
  178.  
  179.                                 )  
  180.  
  181.                             [#V#] => Cvp: SimpleXML koduna bir gözatar mısın?  
  182.  
  183.                         )  
  184.  
  185.                     [ileti] => Array  
  186.  
  187.                         (  
  188.  
  189.                             [tavsiye] => Array  
  190.  
  191.                                 (  
  192.  
  193.                                     [0] => Array  
  194.  
  195.                                         (  
  196.  
  197.                                             [#A#] => Array  
  198.  
  199.                                                 (  
  200.  
  201.                                                     [adres] => öz nitelik 44  
  202.  
  203.                                                 )  
  204.  
  205.                                             [#V#] => tavsiye 4  
  206.  
  207.                                         )  
  208.  
  209.                                     [1] => Array  
  210.  
  211.                                         (  
  212.  
  213.                                             [#A#] => Array  
  214.  
  215.                                                 (  
  216.  
  217.                                                     [adres] => öz nitelik 55  
  218.  
  219.                                                 )  
  220.  
  221.                                             [#V#] => tavsiye 5  
  222.  
  223.                                         )  
  224.  
  225.                                     [2] => Array  
  226.  
  227.                                         (  
  228.  
  229.                                             [#A#] => Array  
  230.  
  231.                                                 (  
  232.  
  233.                                                     [adres] => öz nitelik 66  
  234.  
  235.                                                 )  
  236.  
  237.                                             [#V#] => tavsiye 6  
  238.  
  239.                                         )  
  240.  
  241.                                 )  
  242.  
  243.                             [#A#] => Array  
  244.  
  245.                                 (  
  246.  
  247.                                     [icerik] => HTML  
  248.  
  249.                                 )  
  250.  
  251.                             [#V#] => Orhan’cım kodunu inceledim ve denedim. Gayet güzel işe yarar. eline sağlık.. Selamlar  
  252.  
  253.                         )  
  254.  
  255.                     [#A#] =>  
  256.  
  257.                     [#V#] =>  
  258.  
  259.                 )  
  260.  
  261.         )  
  262.  
  263. )

Düğümlerin Öznitelik ve Değerleri  #A# ve #V#  dizi indisleriyle tanımlanmaktadır. Mesela,  örnek koddaki XML yapısında tanımlanmış “tarih” düğümünün değerine ulaşmak için: 

  1. $dizi[‘tarih’][‘#V#’]

ifadesi kullanılır.