Arama butonu
Bu konudaki kullanıcılar: 1 misafir
6
Cevap
698
Tıklama
0
Öne Çıkarma
PHP'de XML Tagleri Ayıklama
X
9 yıl
Yüzbaşı
Konu Sahibi

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?



S
9 yıl
Yarbay

Neden düzenli ifadeler kullanmıyorsun ki?

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

print_r($sonuc);


Bu mesaja 1 cevap geldi.
X
9 yıl
Yüzbaşı
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @snoppy
S
9 yıl
Yarbay

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 >
Bu mesaja 1 cevap geldi.
X
9 yıl
Yüzbaşı
Konu Sahibi

Ü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>";
}


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @snoppy
S
9 yıl
Yarbay

Ben yine yanlış anlamışım o zaman
Yalnızca "substr" ve "strpos" kullanılacak diye okumuşum.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @X-1
X
9 yıl
Yüzbaşı
Konu Sahibi

Yok siz doğrusunuz. Ben biraz daldan dala olunca :D



< Bu ileti mobil sürüm kullanılarak atıldı >


Bu mesajda bahsedilenler: @snoppy
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.