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
Aşağıdaki kodları bir php sayfasına yapıştır.
$xmlDom->loadXML(file_get_contents("xmlFile.xml"));
Dosyayı sistemine kaydettirdiğin için
Xml dosyasının konumunu da atayabilir veya hazır xml dosyasının adını da yazıp deneyebilirsin...
Sonra kodları analiz edip gerisini kendin çözümlersin.
<table>
<thead>
<tr>
<th>
Miktar
</th>
<th>
Mal Hizmet Adı
</th>
<th>
Tutar
</th>
</tr>
</thead>
<tbody>
<?php
// XmlGird kullandığında bir değere Show Xpath ile konumunu aldığında '/Invoice/cac:InvoiceLine[1]/cac:Item/cbc:Name'
// ('//cac:InvoiceLine/cac:Item/cbc:Name')->item($key) yapmalısın aksi durumda değere ulaşamıyorsun.
$xmlDom = new DOMDocument();
$xmlDom->preserveWhiteSpace = false;
$xmlDom->loadXML(file_get_contents("xmlFile.xml"));
$xpath = new DOMXPath($xmlDom);
$invoiceLine = @$xpath->query('//cac:InvoiceLine');
foreach ($invoiceLine as $key => $val) {
$invoiceLine = [
"ID" => @$xpath->query("//cac:InvoiceLine/cbc:ID")->item($key)->nodeValue,
"InvoicedQuantity" => @$xpath->query("//cac:InvoiceLine/cbc:InvoicedQuantity")->item($key)->nodeValue,
"LineExtensionAmount" => @$xpath->query("//cac:InvoiceLine/cbc:LineExtensionAmount")->item($key)->nodeValue,
"ItemName" => @$xpath->query("//cac:InvoiceLine/cac:Item/cbc:Name")->item($key)->nodeValue,
"ItemID" => @$xpath->query("//cac:InvoiceLine/cac:Item/cac:SellersItemIdentification/cbc:ID")->item($key)->nodeValue,
"Price" => @$xpath->query("//cac:InvoiceLine/cac:Price/cbc:PriceAmount")->item($key)->nodeValue,
];
$tr = "<tr><td>$invoiceLine[LineExtensionAmount]</td><td>$invoiceLine[ItemName]</td><td>$invoiceLine[Price]</td></tr>"
?>
<?= $tr ?>
<?php
}
?>
</tbody>
</table>