Zadejte hledaný výraz...

Rada – xmlreader

David Flídr
verified
rating uzivatele
(22 hodnocení)
1. 11. 2014 11:01:52
Zdravím,
snažím se udělat parser xml pomocí xmlreaderu a data uložit do mysql, zatím se mi to moc nedaří.
function import_test ($shop,$id_cat) {
$reader = new XMLReader();
$reader->open($shop);
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SHOPITEM') {
while ($reader->read()) {
switch ($reader->name) {
case "ITEM_ID":
$reader->read();
$id = $reader->value;
break;
case "URL":
$reader->read();
$link = $reader->value;
break;
case "PRODUCT":
$reader->read();
$title = $reader->value;
break;
case "PRODUCTNAME":
$reader->read();
if (empty($title)) $title = $reader->value;
break;
case "PRICE_VAT":
$reader->read();
$price = $reader->value;
break;
case "DESCRIPTION":
$reader->read();
$desc = $reader->value;
break;
case "IMGURL":
$reader->read();
$img = $reader->value;
break;
case "DELIVERY_DATE":
$reader->read();
$availability = $reader->value;
break;
case "EAN":
$reader->read();
$code = $reader->value;
break;
}
echo $id.' - '.$link.' - '.$title.' - '.$price.' - '.$desc.' - '.$img.' - '.$availability.' - '.$code.' - konec
';
}
}
}
}
Snažím se vypsat jednotlivé položky xml za sebou a pak bych je chtěl uložit do databáze. Ale dělá mi to celkem neplechu. Pokud v každém casu vypíšu hodnotu přes echo, tak je to v pořádku a srovnané. Poradí někdo jak data hodit správně do proměnných a uložit do databáze? Díky
1. 11. 2014 11:01:52
https://webtrh.cz/diskuse/rada-xmlreader#reply1065467
Petr Soukup
verified
rating uzivatele
(5 hodnocení)
1. 11. 2014 11:13:12
Pokud není XML moc velké (tzn menší než třeba 50MB), tak je jednodušší použít toto:
PHP: SimpleXMLElement - Manual
1. 11. 2014 11:13:12
https://webtrh.cz/diskuse/rada-xmlreader#reply1065466
David Flídr
verified
rating uzivatele
(22 hodnocení)
1. 11. 2014 11:19:36
Toto řešení mám aplikované, bohužel mám teď několik větších xml, které je potřeba naimportovat a SimpleXMLElement mi nestačí
---------- Příspěvek doplněn 01.11.2014 v 17:58 ----------
tak jsem kód trochu upravil, ale hází mi to chybu 500, nevíte někdo co s tím?
function import_test ($shop,$id_cat) {
$reader = new XMLReader();
$reader->open($shop);
$i = 0;
while ($reader->read())
{
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'SHOPITEM') {
while ($reader->read()) {
switch ($reader->name) {
case "ITEM_ID":
$reader->read();
$data = $reader->value;
break;
case "URL":
$reader->read();
$data = $reader->value;
break;
case "PRODUCT":
$reader->read();
$data = $reader->value;
break;
case "PRODUCTNAME":
$reader->read();
if (empty($title)) $data = $reader->value;
break;
case "PRICE_VAT":
$reader->read();
$data = $reader->value;
break;
case "DESCRIPTION":
$reader->read();
$data = $reader->value;
break;
case "IMGURL":
$reader->read();
$data = $reader->value;
break;
case "DELIVERY_DATE":
$reader->read();
$data = $reader->value;
break;
case "EAN":
$reader->read();
$data = $reader->value;
break;
}
$i++;
}
}
}
var_dump($data);
}
1. 11. 2014 11:19:36
https://webtrh.cz/diskuse/rada-xmlreader#reply1065465
crs
verified
rating uzivatele
(1 hodnocení)
1. 11. 2014 21:43:49
XMLReader používá knihovnu libxml, ta musí být nainstalovaná.
Na Windows musí současně být povolena knihovna php_openssl.dll (alespoň podle on-line dokumentace)
1. 11. 2014 21:43:49
https://webtrh.cz/diskuse/rada-xmlreader#reply1065464
Smazany ucet 253
verified
rating uzivatele
(3 hodnocení)
14. 11. 2014 14:08:53
Chyba 500 je možná způsobena tím, že přetekl MAX_EXECUTION_TIME nebo byla vyčerpána paměť. Nejlepší a nejrychlejší řešení je použít následující způsob:
$file = "soubor.xml";
$xml = new XMLReader;
$xml->open($file);
$doc = new DOMDocument;
// chceš-li přeskočit na nějaký element, dá se použít rychlý cyklus:
while ($xml->read() AND $xml->name != 'PRODUCT'); // PRODUCT nahradit prvním XML elementem, na který chceš přeskočit
while ($xml->name === 'PRODUCT') {
// import aktuálního uzlu:
$node = simplexml_import_dom($doc->importNode($xml->expand(), true));
// příklad přístupu k elementu daného uzlu:
$id = (string) $node->PRODUCT_ID;
var_dump($id);
// nyní je potřeba přeskočit na další element PRODUCT:
$xml->next('PRODUCT');
}
pokud vyzkoušíte, zjistíte, že to spotřebuje minimum paměti, protože se přeskakuje po jednotlivých uzlech a nenačítá se celý dokument XML souboru do pole (což je někdy hlavní problém)
---------- Příspěvek doplněn 14.11.2014 v 14:15 ----------
samozřejmě pro větší feedy je killer času vkládání do databáze. Tam by bylo dobré využít syntaxi SQL dotazu:
společně s kontrolou max_execution_time > pokud se přiblížíte k vypršení limitu, tak uložit (třeba do souboru) poslední PRODUCT_ID a při dalším spuštění začít od tohoto PRODUCT_ID...........
14. 11. 2014 14:08:53
https://webtrh.cz/diskuse/rada-xmlreader#reply1065463
James_Scott
verified
rating uzivatele
(7 hodnocení)
14. 11. 2014 14:51:33
Pokud je problém max_execution_time, tak co zkusit skript přes CLI, pokud je to mozne?
14. 11. 2014 14:51:33
https://webtrh.cz/diskuse/rada-xmlreader#reply1065462
Smazany ucet 253
verified
rating uzivatele
(3 hodnocení)
14. 11. 2014 15:01:47
@James_Scott: existuje vůbec nějaký hosting, který nabízí přístup do CLI? :-)
14. 11. 2014 15:01:47
https://webtrh.cz/diskuse/rada-xmlreader#reply1065461
James_Scott
verified
rating uzivatele
(7 hodnocení)
14. 11. 2014 16:55:09
@rapemer: Popravde vubec netusim, uz dlouho bezne hostingy nepouzivam... V CR asi ne, v zahranici by se neco mohlo najit...
14. 11. 2014 16:55:09
https://webtrh.cz/diskuse/rada-xmlreader#reply1065460
David Flídr
verified
rating uzivatele
(22 hodnocení)
15. 11. 2014 07:53:29
@James_Scott super, děkuji za vyčerpávající odpověď. Na hostingu pomohlo zvýšení určitých limitů, ale váš způsob určitě vyzkouším.
15. 11. 2014 07:53:29
https://webtrh.cz/diskuse/rada-xmlreader#reply1065459
Pro odpověď se přihlašte.
Přihlásit