Dzień dobry, mam pewien problem dotyczący odczytu pliku XML.
Posiadam poniższą strukturę (urywek kodu) - standard ceneo.
<offers> <o id="47" url="url" price="24.47" stock="32" weight="0.027"> <cat><![CDATA[Kategoria]]></cat> <name><![CDATA[Nazwa]]></name> <imgs> <main url="link"/> <i url="link"/> </imgs> <desc><![CDATA[OPIS]]></desc> <attrs> <a name="Producent"><![CDATA[Producent]]></a> <a name="Kod_Producenta"><![CDATA[Kod]]></a> <a name="EAN"><![CDATA[0000000000000]]></a> </attrs> </o> </offers>
$oFile = http://www.php.net/file_get_contents('Adres do XML'); $oSimpleXmlObject = new SimpleXmlElement($oFile); $oImageSection = $oSimpleXmlObject->xpath('/o/attrs/a["name"]=EAN[.='.$ZmiennaEAN.']/parent::*'); foreach($oImageSection[0]->o['price'] as $oImage) { }
Nie jestem ekspertem w XPath, ale takie coś działa:
Zastosowałem taki zapis:
$oImageSection = $oSimpleXmlObject->xpath("/o[descendant::attrs/a[@name='EAN' and text()=".$ZmiennaEAN."]]/parent::*"); foreach($oImageSection[0]->o[@price] as $oImage)
Dziękuję za pomoc, wygląda na to, że jest ok, natomiast pozostaje jeszcze pętla foreach, w której pobierana jest cena.
Spróbowałem na 2 sposoby.
1.
$oImageSection = $oSimpleXmlObject->xpath('//o/attrs/a[@name="EAN"][contains(text(),' . $ZmiennaEAN . ')]/../..'); foreach($oImageSection[0]->o[@price] as $oImage)
$oImageSection = $oSimpleXmlObject->xpath('//o/attrs/a[@name="EAN"][contains(text(),' . $ZmiennaEAN . ')]/../../o[@price]'); foreach($oImageSection[0] as $oImage)
Napisz, co zwraca $oImageSection.
$dom = new DOMDocument; $dom->encoding = 'UTF-8'; $dom->loadXML('tu_xml'); $ZmiennaEAN = '0000000000000'; $xpath = new DOMXPath($dom); $offers = $xpath->query('//o/attrs/a[@name="EAN"][contains(text(),'.$ZmiennaEAN.')]/../..'); foreach($offers as $offer) { http://www.php.net/echo $offer->getAttribute('price'); }
Po zastosowaniu w/w sposobu otrzymuję takie komunikaty.
Przeszukiwałem internet w celu rozwiązania tego problemu, jednak nic nie pomaga.
Spróbuj:
$dom->load('tu_xml');
Niestety, ale nadal całość nie funkcjonuje.
Nie zostaje wyświetlona żadna wartość.
$dom = new DOMDocument; $dom->encoding = 'UTF-8'; $dom->load('link'); $xpath = new DOMXPath($dom); $offers = $xpath->query('//o/attrs/a[@name="EAN"][contains(text(),'.$ZmiennaEAN.')]/../..'); foreach($offers as $offer) { http://www.php.net/echo $offer->getAttribute('price'); }
A wartość tekstową atrybutu name z cdata dostajesz? Pamiętam że coś trzeba było włączyć do parsowania.
https://www.lonhosford.com/lonblog/2011/01/07/php-simplexml-load-xml-file-preserve-cdata-remove-whitespace-between-nodes-and-return-json/ https://www.php.net/manual/en/class.domdocument.php
Chyba chodzi o
Zmiany w kodowaniach również nie pomogły.
Chyba odpuszczam temat z wykorzystaniem tego XMLa, mam jeszcze możliwość pobierania tych samych danych z API tylko muszę poszerzyć swoją wiedzę na ten temat.
Dziękuję bardzo za pomoc.
A może pokażesz ten XML? Czy dostarczasz poprawną strukturę dla metody load?
Struktura wygląda tak. Całego pliku XML nie mogę udostępnić ze względu na umowę.
<?xml version="1.0" encoding="utf-8"?> <offers xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <o id="96727" url="url" price="56.83" stock="1511" weight="0.42"> <cat><![CDATA[kategoria1]]></cat> <name><![CDATA[nazwa1]]></name> <imgs> <main url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> </imgs> <desc><![CDATA[opis]]></desc> <attrs> <a name="Producent"><![CDATA[producent]]></a> <a name="Kod_Producenta"><![CDATA[1111111]]></a> <a name="EAN"><![CDATA[1111111111111]]></a> </attrs> </o> <o id="92385" url="url" price="74.59" stock="2926" weight="2.8"> <cat><![CDATA[kategoria2]]></cat> <name><![CDATA[nazwa2]]></name> <imgs> <main url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> <i url="url"/> </imgs> <desc><![CDATA[opis]]></desc> <attrs> <a name="Producent"><![CDATA[producent]]></a> <a name="Kod_Producenta"><![CDATA[0000000]]></a> <a name="EAN"><![CDATA[2222222222222]]></a> </attrs> </o> </offers>
Brakuje cudzysłowów. Query będzie mieć taką postać:
$offers = $xpath->query('//o/attrs/a[@name="EAN"][contains(text(),"' . $ZmiennaEAN . '")]/../..');
Udało się, cudzysłów pomógł, serdecznie dziękuję wszystkim za pomoc
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)