ugrás a tartalomhoz

php DOMdocument lehal

Tanul0 · 2012. Jan. 4. (Sze), 14.38
Üdv!

Adot egy adatbázis, amelyet xml formában kell elkészíteni, az elmúlt 1 hónapban tökéletesen működött, most viszont nem sikerült a formázás DOMdocument-el, mert egy üres fájlt ad vissza.

Az xml-ben minden mezőben az értékek CData tag között vannak. Nem tudok rájönni, hogy mi a probléma, próbáltam már mindenféle speckó karaktert szűrni de nem jutottam előrébb.

$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($nxml->asXML());
$dom->saveXML();
$dom->save('grando.xml');
A kimenet itt található:

http://www.robogowebshop.hu/grando2.php

Előre is köszönöm!

Ui: helyesírási hibákért boccs, csak sietek :)

Üdv!
 
1

Nekem nem üres. Sőt, nagyon

Pethical · 2012. Jan. 4. (Sze), 15.09
Nekem nem üres. Sőt, nagyon nagy.
2

Nálam sem üres, szerintem

inf3rno · 2012. Jan. 4. (Sze), 15.15
Nálam sem üres, szerintem timeout vagy ilyesmi miatt láthatja üresnek...
3

Persze hogy nem üres, mivel

Tanul0 · 2012. Jan. 4. (Sze), 16.48
Persze hogy nem üres, mivel ez a formázás előtti állapot. Erre eresztem rá a DOMdocument-et hogy formázva legyen az xml.

Csak az $nxml->asXML();-t iratom ki, hogy lássátok, min hasal el :)
4

Lehet, hogy elfogy a memória

Hidvégi Gábor · 2012. Jan. 4. (Sze), 17.07
Lehet, hogy elfogy a memória a feldolgozás közben.

Az XML egyébként egy nagyon jó kis formátum, de adatbázisnak használni ennyi adatnál nem épp a legcélszerűbb.
7

Ez termék szinkronizációhoz

Tanul0 · 2012. Jan. 4. (Sze), 18.11
Ez termék szinkronizációhoz készül, van még lehetőség csv készítésre is, de azzal még több baj van. Az az érdekes, hogy eddig volt 13k termék, annál tökéletesen működött a dolog, viszont most egy másik beszállítótól jött szinkron újabb ~10K termékkel, a grando viszont csak is kizárólag egyszerre fogadja a termék listát.
8

hosszú sorok / kevés memória

Poetro · 2012. Jan. 4. (Sze), 18.15
Nem lehet hogy túl hosszúak a sorok? Mondjuk érdemes lenne eltörni a sorokat minden <product> előtt, illetve megnézni, hogy mennyi memória érhető el a PHP számára. Mert egy 16Mb-os XML fájlból épített DOMDocument valószínűleg megeszik vagy 32Mb memóriát.

szerk:
A fenti módosítást eszközölve a fájlra, már működik is a dolog.
9

Jogos a feltevés, csak

Tanul0 · 2012. Jan. 4. (Sze), 18.21
Jogos a feltevés, csak lejjebb írtam, hogy SimpleXML-el készül a fájl, így miként hogyan rakjak bele sortörést? Esetleg

      preg_match_all("/\<product\>(.*?)\<\/product\>/", $xml, $xmlline);
és újra pakoljam össze? csak addjak hozzá egy sortörést?
11

str_replace

Poetro · 2012. Jan. 4. (Sze), 18.26
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$xml = file_get_contents('grando.xml');
$xml = str_replace('<product>', "\n<product>", $xml);
$dom->loadXML($xml);
12

Köszönöm, megpróbálom amint

Tanul0 · 2012. Jan. 4. (Sze), 18.28
Köszönöm, megpróbálom amint hazaértem és írok :)
14

Amit linkeltem kimenetet,

Tanul0 · 2012. Jan. 4. (Sze), 20.05
Amit linkeltem kimenetet, abba nem volt benne csak a 13K termék, a másik 10K nem. Speckó karaktereket kiszűrtem, most már nem dob semmilyen warningot, viszont amit fentebb írtál:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 39282732 bytes)

Na most nem tudom mit tudok ilyenkor csinálni.

formázzam str_replace-el, hogy berakom a sörtéreseket meg a tab-okat, vagy szedjem darabokra és úgy engedjem rá a DOMdocument-et.

Vagy másik lehetőség, hogy megkérdezem a szolgáltatót hogy növeljék meg a memória használatot, ami vagy plusz költséggel jár, vagy egyáltalán nem fognak belemenni. Mivel a futásidő hosszabítást sem engedik 120 fölé.
16

A memóriakorlát emelése csak

Hidvégi Gábor · 2012. Jan. 4. (Sze), 20.08
A memóriakorlát emelése csak felületi kezelés.
17

Ne DOM-mal

Pepita · 2012. Jan. 5. (Cs), 00.15
Ne DOM-mal dolgozd fel, hanem xml_parser függvényekkel. Így lehetőséged lesz szakaszosan feldolgozni, de neked kell megírni a feldolgozót. Kicsit bonyolult a használata, de nagy fájlmérethez ezt ajánlják, ha jól értettem.
Persze, ha az egész adatbázist be akarod olvasni (és pl. tömbbe rakni), akkor szintén számíthatsz memóriagondokra, de amit Poetro is írt (16M ~= 32M), azt kiküszöbölheted ezzel a szakaszonkénti kezeléssel. Nem kell rögtön a fájlt széttördelni.

Szerk: most olvastam újra, megjelenítési feladat nincs (tehát "tömbösíteni" sem akarsz), viszont egyetlen fájl kell -> ez lesz neked a jó megoldás.
15

Esetleg próbáld meg több

Hidvégi Gábor · 2012. Jan. 4. (Sze), 20.06
Esetleg próbáld meg több részre bontani a terméklistát, mondjuk ezer tételenként.

Szerkesztés: most látom, hogy inf3rno már megelőzött.
18

Ohh én azt csak debug miatt

inf3rno · 2012. Jan. 5. (Cs), 10.41
Ohh én azt csak debug miatt írtam... Hibás az XML, aztán kisebb statikus XML-t könnyebb debuggolni, mint egy nagy generáltat...
5

Hibás

Poetro · 2012. Jan. 4. (Sze), 17.14
Ha nézted a PHP hibajelzéseit, akkor láthatod, hogy az XML hibás:
Warning: DOMDocument::loadXML(): Couldn't find end of Start Tag availability_93 line 2 in Entity, line: 2 in F:\temp\PHP-1.php on line 6

Warning: DOMDocument::loadXML(): Premature end of data in tag product line 2 in Entity, line: 2 in F:\temp\PHP-1.php on line 6

Warning: DOMDocument::loadXML(): Premature end of data in tag products line 2 in Entity, line: 2 in F:\temp\PHP-1.php on line 6
Szóval előbb az XML-ben levő hibákat kellene kijavítani, csak utána fog működni.

szerk:
Elnézést, nem volt letöltve valamiért a teljes fájl. Viszont, mostmár, hogy le van töltve, rengeteg más hibát ír ki a PHP.
6

Ha nézted a PHP

kuka · 2012. Jan. 4. (Sze), 17.43
Ha nézted a PHP hibajelzéseit, akkor láthatod, hogy az XML hibás:
Érdekes. XMLStarlet szerint well-formedness szempontból valid.
Szóval előbb az XML-ben levő hibákat kellene kijavítani, csak utána fog működni.
loadXML() nálam az első sorra panaszkodik, márpedig ott nem látok hibát:
Warning: DOMDocument::loadXML(): Start tag expected, '<' not found in Entity, line: 1 in php shell code on line 1
Részemről én nem próbálnék ekkora adat XML-t beerőltetni DOM parserbe. A DOM parser dokumentum XML-eknek való, nem adatoknak.
10

Az a baj, hogy a SimpleXML és

Tanul0 · 2012. Jan. 4. (Sze), 18.25
Az a baj, hogy a SimpleXML és a hozzá gyártott gyermek osztály a CData miatt, 1 sorba rakja a teljes tartalmat. Így elég nehéz megtalálni a hiábát benne. Szerintem valami speckó karakter lehet ludas, csak még nem jöttem rá, hogy melyik. Vagy amit fentebb írt Poetro
13

Próbáld kisebb

inf3rno · 2012. Jan. 4. (Sze), 19.04
Próbáld kisebb adatmennyiséggel generálni az XML fájlt, aztán tördeld el a >< részeknél... Bármelyik átlag szövegszerkesztőben van replace ilyen esetre... Mentsd el, aztán úgy próbáld betölteni php-val...