PHP XML while döngüsüyle işlem
Merhaba, şöyle bir xml dosyam var <cbc:Name></cbc:Name> while döngüsüne aldım başarıyla tüm bilgileri aldı yalnız bana alttaki TL KDV bölümüde gerekiyor kolon kolon ayırıp aynı tabloda birleştiricem
PHP KODU bu şekilde
function ara($bas, $son, $yazi)
{
@preg_match_all('/' . preg_quote($bas, '/') .
'(.*?)'. preg_quote($son, '/').'/i', $yazi, $m);
return @$m[1];
}
if(isset($_FILES['dosya'])){
$hata = $_FILES['dosya']['error'];
if($hata != 0) {
echo 'Yüklenirken bir hata gerçekleşmiş.';
} else {
$boyut = $_FILES['dosya']['size'];
if($boyut > (1024*1024*3)){
echo 'Dosya 3MB den büyük olamaz.';
} else {
$isim = $_FILES['dosya']['name'];
$uzanti = explode('.', $isim);
$uzanti = $uzanti[count($uzanti)-1];
$dosya = $_FILES['dosya']['tmp_name'];
copy($dosya, 'dosyalar/' . $_FILES['dosya']['name']);
echo '<br>Dosyanız upload edildi!';
$dosya = $dosya;
$icerik = file_get_contents($dosya);
$unvan = ara('<cbc:Name>', '</cbc:Name>', $icerik);
$adres = ara('<cbc:StreetName>', '</cbc:StreetName>', $icerik);
$sirketMahalle = ara('<cbc:CitySubdivisionName>', '</cbc:CitySubdivisionName>', $icerik);
$sirketSehir = ara('<cbc:CityName>', '</cbc:CityName>', $icerik);
$faturaNo = ara('<cbc:ID>', '</cbc:ID>', $icerik);
$vergiDairesi = ara('<cac:TaxScheme><cbc:Name>', '</cbc:Name></cac:TaxScheme>', $icerik);
$vergiNo = ara('<cbc:ID schemeID="VKN">', '</cbc:ID>', $icerik);
$faturaAciklama = ara('<cac:Item>', '</cac:Item>', $icerik);
$urunTutar = ara('<cac:Price>', '</cac:Price>', $icerik);
$toplamTutar = ara('<cbc:PriceAmount currencyID="TRY">', '</cbc:PriceAmount>', $icerik);
//echo str_replace('<', '<', $icerik);
echo
'<br><br><br><b>Şirket Ünvanı:</b> ' . $unvan[0]
.'<br><b>Şirket Adres:</b> ' . $adres[0]
.'<br><b>Şirket Mahalle:</b> ' . $sirketMahalle[0]
.'<br><b>Şirket Şehir:</b> ' . $sirketSehir[0]
.'<br><b>Fatura Numarası: </b>' . $faturaNo[0]
.'<br><b>Vergi Dairesi: </b>' . $vergiDairesi[0]
.'<br><b>Vergi Numarası: </b>' . $vergiNo[0]
.'<br><b>Fatura Açıklaması: </b>' . $faturaAciklama[0]
.'<br><br><b>Fatura Toplam Tutar: </b>' . $toplamTutar[0]. " TL";
foreach ($faturaAciklama as $ftraciklama){
echo "<br>".$ftraciklama."<br>";
}
}
}
}
foreach ($faturaAciklama as $ftraciklama){
echo "<br>".$ftraciklama."<br>";
kdv bölümünü ve sayıları örnek "ürün açıklaması, fiyat, kdv" şeklinde yan yana sıralamak için ne yapabilirim
böyle bir şey olamaz ya :D kod gözüme çok karmaşık geldi, biraz düzenleyip biraz da kısaltayım dedim. kısalmadı ahah, üstüne 5-6 satır daha fazla oldu boşlukları sildiğim halde.
soruyu anlaması zor, daha detaylı ve teknik sorarsan daha iyi yardımcı olabiliriz. sanırım son döngüde ki gelen değerler ile alakalı bazı nitelikleri almak istiyorsun. ama böyle olmaz, birde resimden kod çıkartıp xml mi parçalayacağız? xml'i eklemen lazım.
function ara($bas, $son, $yazi){
@preg_match_all('/' .preg_quote($bas, '/').'(.*?)'. preg_quote($son, '/').'/i', $yazi, $m);
return @$m[1][0];
}
if(isset($_FILES['dosya'])){
$hata = $_FILES['dosya']['error'];
if($hata != 0) {
echo 'Yüklenirken bir hata gerçekleşmiş.';
}else{
$boyut = $_FILES['dosya']['size'];
if($boyut > (1024*1024*3)){
echo 'Dosya 3MB den büyük olamaz.';
}else{
$elementler = [
"unvan" => 'cbc:Name',
"adres" => 'cbc:StreetName',
"sirketMahalle" => 'cbc:CitySubdivisionName',
"sirketSehir" => 'cbc:CityName',
"faturaNo" => 'cbc:ID',
"vergiDairesi" => ['<cac:TaxScheme><cbc:Name>', '</cbc:Name></cac:TaxScheme>'],
"vergiNo" => ['<cbc:ID schemeID="VKN">', '</cbc:ID>'],
"faturaAciklama" => 'cac:Item',
"urunTutar" => 'cac:Price>',
"toplamTutar" => ['<cbc:PriceAmount currencyID="TRY">', '</cbc:PriceAmount>']
];
$uzanti = preg_replace('/.*?\.(.*)$/', '$1', $dosya);
$dosya = $_FILES['dosya']['tmp_name'];
copy($dosya, 'dosyalar/'.$_FILES['dosya']['name']);
echo '<br>Dosyanız upload edildi!';
$icerik = file_get_contents($dosya);
$sonuc = array();
foreach($elementler as $key => $e){
$sonuc[$key] = is_string($e) ? ara("<$e>", "</$e>", $icerik) : ara($e[0], $e[1], $icerik);
}
//echo str_replace('<', '<', $icerik);
echo "
<b>Şirket Ünvanı:</b> {$sonuc["unvan"]}<br>
<b>Şirket Adres:</b> {$sonuc["adres"]}<br>
<b>Şirket Mahalle:</b> {$sonuc["sirketMahalle"]}<br>
<b>Şirket Şehir:</b> {$sonuc["sirketSehir"]}<br>
<b>Fatura Numarası:</b> {$sonuc["faturaNo"]}<br>
<b>Vergi Dairesi:</b> {$sonuc["vergiDairesi"]}<br>
<b>Vergi Numarası:</b> {$sonuc["vergiNo"]}<br>
<b>Fatura Açıklamas:</b> {$sonuc["faturaAciklama"]}<br>
<b>Urun Toplam Tutar:</b> {$sonuc["urunTutar"]}<br>
<b>Fatura Toplam Tutar:</b> {$sonuc["toplamTutar"]}<br>
";
echo strip_tags($sonuc["faturaAciklama"], '<cac:TaxSubtotal>');
//echo strip_tags($sonuc["faturaAciklama"], ['<cac:TaxSubtotal>', '<cbc>']); //çoklu kullanım
//echo strip_tags($sonuc["faturaAciklama"]); //tamamen temizlenmiş
}
}
}
yukarıdaki de söz de daha okunaklı yaptığım hali : )
hızlı çözüm istersen
strip_tags https://www.php.net/manual/tr/function.strip-tags.php
bu yöntemi bi dene derim, tüm elementleri kaldıracak sadece metinleri bırakacak, belki anlaması kolay olması için bir iki elementi sonra silmek üzere de bırakabilirsin.
ama kalıcı bir çözüm ve kendini geliştirmek istersen, https://www.php.net/manual/tr/class.domdocument.php bu sınıfı öğrenmeni tavsiye ederim. bende yakın zamana kadar preg_match kullanıyordum ve buna geçtim rahatladım.