php ile xml okuma Problemi
merhaba arkadaşlar yardımınıza ihtiyacım var.
https://korfezotoyedekparca.site/martas1.xml adresinde ürünlerimin bulunduğu bir xml mevcut bu ürünlerin olduğu xml i
<?php
$data = simplexml_load_file("https://korfezotoyedekparca.site/martas1.xml");
$xml = new SimpleXMLElement("<xml/>");
foreach ($data->Products as $Products);
$Products= $xml->addChild("Products");
$Product_elements =$Products->addchild("Product");
$Product_elements->addchild("ID", $data->Result->Products->Product["ID"]);
$Product_elements->addchild("BrandID", $data->Result->Products->Product["BrandID"]);
$Product_elements->addchild("ProductCode", $data->Result->Products->Product["ProductCode"]);
$Product_elements->addchild("Unit", $data->Result->Products->Product["Unit"]);
$Product_elements->addchild("MinOrderAmount", $data->Result->Products->Product["MinOrderAmount"]);
$Product_elements->addchild("BaseOeNr", $data->Result->Products->Product->BaseOeNr);
$Product_elements->addchild("ProductName", $data->Result->Products->Product->ProductNames->ProductName);
$Product_elements->addchild("Price", $data->Result->Products->Product->Pricing->LocalNetPriceWVat);
header('content-type:text/xml');
echo $xml->asXML();
?>
bu kod ile almaya çalışıyorum ancak normalde 310.000 adet ürün var.
Deneme amaçlı 3 tane koydum ancak sadece 1 tanesini yani en baştaki ürünü çekebiliyorum yardımcı olursanız çok sevinirim.
<xml>
<Products>
<Product>
<ID>135557</ID>
<BrandID>174</BrandID>
<ProductCode>KR-PML-PXCRA-002L1</ProductCode>
<Unit>PCE</Unit>
<MinOrderAmount>1</MinOrderAmount>
<BaseOeNr>5525744100</BaseOeNr>
<ProductName>MAKAS LASTIK-(HYUNDAI: H100 MINUBUS 94>08/H100 KAMYONET 94>11/MITSUBISHI: L300 90>11 )UZUN</ProductName>
<Price>6.67267752</Price>
</Product>
</Products>
</xml>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
evet. gerçekten uzun bir süre uğraşmışsın eğer dediğin kadar vakit aldıysa, SimpleXMLElement
bunun için tercih edeceğim bir sınıf değil. son mesajında belirtiğin okumayı, örneğimi inceleseniz ve dökümana sadece bir göz atsanız basitçe şöyle yapabilirdiniz;
$xml = new SimpleXMLElement('https://korfezotoyedekparca.site/martas1.xml', LIBXML_PARSEHUGE, true);
$urun = $xml->xpath('//Products');
header('content-type:text/xml');
foreach($urun as $u){
echo $u->asXML();
}
ama benim tercihim DomDocument
olurdu, daha fazla seçeneği mevcut, üstelik html ile çalışacağınız zamanda bu sınıfı kullanabilirsiniz, ilerde faydası olur bu açıdan;
$file = file_get_contents('https://korfezotoyedekparca.site/martas1.xml');
$dom = new DomDocument();
$dom->loadXML($file);
$urunler = $dom->getElementsByTagName('Products')[0];
header('content-type:text/xml');
echo $dom->saveXML($urunler);
ikincisi ayrıca daha performanslı.
ikisininde sonucu şu;
merhaba; munzevi yazdıklarıkda sonuna kadar haklısın, çoğu yerde görüyorum konu açılmış altında bir sürü bu işle uğraşan kişi
yorum yazmış sorunu çözmeye çalışmış, adam bir daha girip birşey yazmamış, sorunu çözdümü hangi bilgi ile çözdü geri dönüş yok. bu konuda haklısın ben 1 aydır uğraşıyorum bu konu ile ilgili
verdiğin örneklede xpath kısmını yazınca istediklerimi echo ile görüntülüyorum ama xml e kaydederken yine hepsini alıyor. sadece product tag ının altındakileri xml e kaydetmek istiyorum
Array
(
[0] => SimpleXMLElement Object
(
[Product] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[ID] => 28342
[BrandID] => 18
[ProductCode] => ORJ-02505
[ProducerCode] =>
[MinOrderAmount] => 1
[PiecesInBox] => 1
[Unit] => PCE
[New] => false
)
[ProductNames] => SimpleXMLElement Object
(
[ProductName] => UZUN ROT ( AUDI : A4 95-00 )
)
[BaseOeNr] => SimpleXMLElement Object
(
)
[Pricing] => SimpleXMLElement Object
(
[ListPriceCurrency] => TLY
[LocalCurrency] => TLY
[CurrencyRate] => 1
[ListPriceWoVAT] => 0
[LocalListPriceWVat] => 0
[LocalListPriceWoVat] => 0
[LocalNetPriceWVat] => 0
[LocalNetPriceWoVat] => 0
[Discount1] => 42
[Discount2] => 0
[Discount3] => 0
[Discount4] => 0
[Discount5] => 0
[Discount6] => 0
[InDiscount] => false
)
[Stocks] => SimpleXMLElement Object
(
[Stock] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
)
)
)
var_dump
kullanarak aldığın sonuçların uzunluğunu görebilirsin. sen sınıfı yanlış başlatmışsın, ayrıca bu kadar büyük bir xml verisinde sadece bir tane olan tagı döngüye almışsın. sonuçlarıda aliasdan değil ana değişkenden okuyorsun, tabi ki de tek sonuç dönüyor. addChild
ekler, sen boş dökümana son sonuçları ekliyorsun. benim verdiğim örneğin sonuçlarını döngü içerisinde kullanarak ekleme yapman gerekiyor. tam kod da ekleyebilirdim çalışan bir örnek için ama, bazı arkadaşlar çözüme ulaşana kadar (çalışan tam kod örneğine) patır patır yanıt verip, sonra konuyu çözümsüz bırakıp yeni sorular soruyorlar. halbu ki işlerini gördüler, sorunlarını çözdüler. içimden gelmiyor artık tam kod eklemek. örnek orda, mantık burada. denersen doğrusunu yapacaksın.
verdiğim örnekle yapacağın da şu yani;
foreach($urun as $e){
}
toplama konsunda ise, spesifik durumlarda seçimlerinize devam etmek için ve yeni sonuçlar üretmek için, referans olarak okuyacağınız değerlerde xpath
methoduna regex
kullanarak başvurmanız gerekmekte.
$xml->xpath('//Stock/@WarehouseID');
Merhaba munzevi öncelikle cevabın için çok teşekkür ederim.
Aslında konuyada yanlış girdim, en baştan tekrar sorayım ve neden böyle yaptığımı açıklayayım.
ürünlerin olduğu xml i c# ile araştırarak tedarikçimin vermiş olduğu web servisten çekiyorum, tam bilgim olmadığı için c# de
xml'in tamamını çekiyorum, çok uğraşmama rağmen düzenleyemedim.
<Resultofproductlist>
<Result>
<Products>
<Product>
<ID></ID>
<ProductCode></ProductCode>
</Product>
</Products>
</Result>
</resultofproductlist>
şeklinde geliyor benim istediğim
<Products>
<Product>
<ID></ID>
<ProductCode></ProductCode>
</Product>
</Products>
bu şekilde olması gerekli - o yüzden c# ile verileri çekiyorum xml olarak kaydettiriyorum. daha sonrada c# de düzenleyemediğim için php ile
bu şekilde düzenlemeye çalıştım. birde bunu hergün yapmam gerekecek ürünlerin güncellenmesi için. ne yapmam gerektiği konusunda
yardımcı olursanız çok sevinirim.
birde xml de gördüğünüz stock altında 5 adet depo var her birinde farklı stok var bunları tekbir alanda toplatmam gerekecek.
önce keşke dökümanı inceleseydiniz, kullanımınız bir çok farklı açıdan yanlış.
bu benim hazırladığım durumu en yalın haliyle özetleyen kod
$xml = new SimpleXMLElement('https://korfezotoyedekparca.site/martas1.xml', LIBXML_PARSEHUGE, true);
$urun = $xml->xpath('//Products');
print_r($urun);
hatan ise, ürünleri okumak değil, anahtarlarını kullanarak ürün oluşturmaya çalışmak. başlangıcın böyle olmalı. örnek kodda tüm ürünlerin bilgileri ve xml nitelikleri mevcut. istediğiniz şekilde oluşturabilirsiniz. ürünleri oluştururken döngüye almanız gerekiyor, okurken değil.
php'nin kendi sitesindeki örneği ise;
function RecurseXML($xml,$parent="")
{
$child_count = 0;
foreach($xml as $key=>$value)
{
$child_count++;
if(RecurseXML($value,$parent.".".$key) == 0) // no childern, aka "leaf node"
{
print($parent . "." . $key . " = " . $value . "<BR>\n");
}
}
return $child_count;
}
döküman adresi https://www.php.net/manual/tr/class.simplexmlelement.php