Şimdi Ara

PHP'de XML Tagleri Ayıklama

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
7
Cevap
0
Favori
677
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Selam

    Yazdığım aslında yıllar önce internetten trick diye aldığım bir kod var elimde.

    Bu kod ile girilen verideki belirli tagler arasındaki veriyi çıkartabiliyorsunuz.

    Ben bunu yapıyorum ve tek şekilde bilgi olarak alıyor.

     
    function xmlAyikla($xml_verisi,$baslangic_tagi,$bitis_tagi)
    {

    $baslangic_tag_pozisyonu = strpos($xml_verisi,$baslangic_tagi);

    $bitis_tag_pozisyonu = strpos($xml_verisi,$bitis_tagi,$baslangic_tag_pozisyonu);

    $bitis_tag_boyutu = strlen($bitis_tagi);

    $uzunluk = ($bitis_tag_pozisyonu+$bitis_tag_boyutu)-$baslangic_tag_pozisyonu;

    $sonuc = substr($xml_verisi,$baslangic_tag_pozisyonu,$uzunluk);

    return $sonuc;
    }

    $tag = xmlAyikla($xml,'<isim','/isim>')."<br/>";
    echo $tag;



    Bu da XML kodu:

     
    <kahvalti_menusu>
    <yiyecek>
    <isim>Belgian Waffles</isim>
    <fiyat>$5.95</fiyat>
    <aciklama>Two of our famous Belgian Waffles with plenty of real maple syrup</aciklama>
    <kalori>650</kalori>
    </yiyecek>
    <yiyecek>
    <isim>Strawberry Belgian Waffles</isim>
    <fiyat>$7.95</fiyat>
    <aciklama>Light Belgian waffles covered with strawberries and whipped cream</aciklama>
    <kalori>900</kalori> </yiyecek>
    <yiyecek>
    <isim>Berry-Berry Belgian Waffles</isim>
    <fiyat>$8.95</fiyat>
    <aciklama>Light Belgian waffles covered with an assortment of fresh berries and whipped cream</aciklama>
    <kalori>900</kalori> </yiyecek>
    <yiyecek>
    <isim>French Toast</isim>
    <fiyat>$4.50</fiyat>
    <aciklama>Thick slices made from our homemade sourdough bread</aciklama>
    <kalori>600</kalori>
    </yiyecek>
    <yiyecek>
    <isim>Homestyle Breakfast</isim>
    <fiyat>$6.95</fiyat>
    <aciklama>Two eggs, bacon or sausage, toast, and our ever-popular hash browns</aciklama>
    <kalori>950</kalori>
    </yiyecek>
    </kahvalti_menusu>


    Ancak bu kod sadece ilk bölümdeki bilgileri çekiyor diğerlerini almıyor. XML kütüphaneleri, plaintext vs. bir çok konuda nasıl yapılır biliyorum.

    Fakat hoca string fonksiyonlarla yapılsın diyor. Şimdi burada sıkıntı şu:

    Bu fonksiyonlar sanki girilen değerdeki verilerde arama yapıyorlar. Peki bir sonraki <isim> tagının pozisyonunu nereden bulacağım? Sürekli pozisyon araması için sürekli aşağılara gidecek. Nasıl çözebilirim?

    Her defasında farklı olanı çağırmam için nasıl bir düzeltme yapabilirim?







  • Neden düzenli ifadeler kullanmıyorsun ki?

     
    preg_match_all('%<isim>(.*?)</isim>%', $xml, $sonuclar, PREG_PATTERN_ORDER);
    $sonuc = $sonuclar[1];

    print_r($sonuc);
  • snoppy kullanıcısına yanıt
    Selam

    "...Fakat hoca string fonksiyonlarla yapılsın diyor." şeklinde yazmıştım üstad.

    Yoksa preg_match yerine hazır Simple_XML gibi built-in de kullanacaktım.

    Yani sadece kullanılması gereken strpos ve substr gibi iki fonksiyon.
  • quote:

    Orijinalden alıntı: X-1
    "...Fakat hoca string fonksiyonlarla yapılsın diyor."

    Ben bunu görmemişim ya

    Sanırım hocanız rekürsif fonksiyon kullanmanızı istediği için bu şekilde bir kısıtlama yapmış.
    Yalnızca strpos ve substr kullanarak şöyle yapabilirsin o halde

     
    function xmlAyikla(&$xml, $tag_ac, $tag_kapa, $offset = 0)
    {
    // XML'in üzerinde çalışacağım kısmı.
    // her iterasyonda üzerinde çalışacağım bu kısmı daraltıyorum.
    $xml = substr($xml, $offset);

    // bu çalışağım kısım içerisinde <x>___</x> etiketini arıyorum
    $pos_bas = strpos($xml, $tag_ac);
    $pos_son = strpos($xml, $tag_kapa);

    // etiketleri bulamazsam fonksiyonu sonlandırıyorum.
    if (!$pos_bas || !$pos_son) return;

    // bir sonraki iterasyon için XML'i daraltmaya başlayacağım konumu önceden belirliyorum.
    $offset = $pos_son + strlen($tag_kapa);

    // etiketler arasındaki içeriği alıyorum
    // <x>____</x> arasındakileri alıyorum.
    $pos_bas = $pos_bas + strlen($tag_ac);
    $pos_son = $pos_son - $pos_bas;
    $tag_icerik = substr($xml, $pos_bas, $pos_son);

    printf("<li><b>$tag_icerik</b></li>");

    // rekürsif olarak XML'i yeniden fonksiyonun kendisine gönderiyorum.
    return xmlAyikla($xml, $tag_ac, $tag_kapa, $offset);
    }


     
    // fonksiyonu çalıştır:
    $xml = "..............................";
    xmlAyikla($xml, '<isim>', '</isim>', 0);



    < Bu mesaj bu kişi tarafından değiştirildi snoppy -- 4 Kasım 2015; 21:18:53 >




  • snoppy kullanıcısına yanıt
    Üstad teşekkür ederim. Açıkcası bugün ben farklı bir şekilde ayarladım onu. Aşağıdaki kod biraz bad practice gibi duruyor olsa da işe yarıyor ve çalışıyor. Yalnız sizin yazdığınız kodu da deneyeceğim hemen :) Elinize sağlık.

     
    $xml = $_POST['xml'];

    $isimDizi = explode("<isim>", $xml);
    $fiyatDizi = explode("<fiyat>", $xml);
    $aciklamaDizi = explode("<aciklama>", $xml);
    $kaloriDizi = explode("<kalori>", $xml);
    for($i=1; $i<count($isimDizi);$i++){
    $isim = explode("</isim>", $isimDizi[$i])[0];
    $fiyat = explode("</fiyat>", $fiyatDizi[$i])[0];
    $aciklama = explode("</aciklama>", $aciklamaDizi[$i])[0];
    $kalori = explode("</kalori>", $kaloriDizi[$i])[0];
    echo "<p>";
    echo('<b>Yiyecek Adı:</b> '.$isim.' <b>Fiyatı:</b> '.$fiyat. ' <b>Açıklama:</b> '. $aciklama. ' <b>Kalori:</b> '.$kalori);
    echo "</p>";
    }




  • X-1 kullanıcısına yanıt
    Ben yine yanlış anlamışım o zaman
    Yalnızca "substr" ve "strpos" kullanılacak diye okumuşum.
  • snoppy kullanıcısına yanıt
    Yok siz doğrusunuz. Ben biraz daldan dala olunca :D

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.