Autor Zpráva
tatyalien
Profil
Dobrý den, mám dotázek u parsování xml pomocí simplexml_load_file mě funguje, ale zdrojový soubor má cca 16mb (dělám to na localhostu, takže není problém si nastavit delší dobu skriptu), ale načtení souboru mě trvá cca 15s, mám sice na to již vytvořené aktualizační texty na obrazovku pro uživatele, ale chtěl jsem to zkusti přepsat pomocí funkce: XMLReader. A narazil zde pak na problémy...

příkladový xml je tento:

<?xml version='1.0' encoding='UTF-8'?>
<export_full date='2011-03-28 02:17:31'>
	<items>
		<item code='A0002' image='http://www.example.com/fotogalerie/450x450/A0002_2.jpg' name='Testovací položka 1' brand='Dodavatel 1' czk='99999.00' eur='9999.00' created='2009-09-27 09:30:36' changed='' new='false' stock='false' date=''>
		</item>
		<item code='A2061' image='http://www.example.com/fotogalerie/450x450/A2061_2.jpg' name='Testovací položka 2' brand='Dodavatel 2' czk='999.00' eur='38.80' created='' changed='2010-04-19 07:55:09' new='false' stock='false' date=''>
			<descriptions>
				<description title='Charakteristika' order='1'>&lt;p&gt;Popiska prodkuktu&lt;/p&gt;</description>
				<description title='Obsah balení' order='3'>&lt;p&gt;Stavebnice obsahuje hotový trup...&lt;/p&gt;</description>
				<description title='Charakteristika' order='4'>&lt;p&gt;Další hodnoty....&lt;/p&gt;</description>
				<description title='Doporučujeme koupit' order='5'>&lt;p&gt;Kup vše ;)&lt;/p&gt;</description>
			</descriptions>
			<specs>
				<spec name='Rozpětí'>870 mm</spec>
				<spec name='Délka'>860 mm</spec>
				<spec name='Nosná plocha'>20,6 dm²</spec>
				<spec name='Letová hmotnost'>440 g</spec>
				<spec name='Plošné zatížení'>21 g/dm²</spec>
				<spec name='Elektro pohon'>Mutron SCU1210.103, Park 400 Outrunner 920ot/V</spec>
				<spec name='Baterie'>2 čl. LiPol 1200 - 1500 mAh</spec>
				<spec name='Funkce'>Směrovka, výškovka, křidélka, motor</spec>
			</specs>
			<attachments>
				<attachment name='Manuály' order='1'>
					<item type='file' src='http://www.example.com/abc.pdf' size='428525' hash='' >Manuál</item>
				</attachment>
			</attachments>
			<gallery>
				<image ref='http://www.example.com/fotogalerie/450x450/P9290575.jpg' title='' size='31347' hash='20d14374ca5690f7bf5a2ac462bed9ac'></image>
				<image ref='http://www.example.com/fotogalerie/450x450/P9300680.jpg' title='' size='22712' hash='71ad435bf6ef354ba8767cd1bdc0609e'></image>
				<image ref='http://www.example.com/fotogalerie/450x450/P9300683.jpg' title='' size='19871' hash='f307a5defb75b5427687c6252e7d4b0a'></image>
			</gallery>
			<parts>
				<part name='Náhradní díly' order='1'>
					<item code='A2061/1'></item>
					<item code='A2061/2'></item>
					<item code='A2061/5'></item>
					<item code='A2061/8'></item>
				</part>
				<part name='Doporučené příslušenství' order='3'>
					<item code='BFS30-1000-0301'></item>
					<item code='BFS30-1300-0301'></item>
					<item code='BFS30-1550-0301'></item>
				</part>
			</parts>
		</item>
		<item code='A2061/1' image=http://www.example.com/fotogalerie/450x450/A2061-1_2.jpg' name='Testovací položka 3' brand='aba' czk='599.00' eur='23.30' created='' changed='' new='false' stock='false' date=''>
		</item>
		<item code='A2061/2' image='http://www.example.com/fotogalerie/450x450/A2061-2_2.jpg' name='Testovací položka 4' brand='aba' czk='599.00' eur='23.30' created='' changed='' new='false' stock='false' date=''>
		</item>
	</items>
</export_full>


Zde mám problém, že <item> je zde použit několikrát... v simplexml_load_file jsem si to ošetřil pomocí vnořených cyklů, ale XMLReader čte data po řádku a nejde mě tedy jednoduše použít:

if($xml->nodeType == XMLReader::ELEMENT && $xml->localName == "item")


Protože item je ve více hodnotách, je to jako zboží, jako katalog v přiřazených hodnotách...

Nejde nějak ošetřit, že pokud například dorazím k uzlu: <parts>, tak se posunout v hloubce, ten obsahuje vždy další <part name=xxx> a u něj jsou pak zase item?
Takto jsem to měl v simple:

            if (isset($item->attachments)) {
                $prilozene_soubory = "<strong>Příložené soubory k položce</strong><ol>";
                // první průchod sestaví zda se jedná o manuál, video, atd
                foreach ($item->attachments->attachment as $hodnota_attachment) {
                    // rozsekám xmlko
                    $attr_attachment = $hodnota_attachment->attributes();
                    $prilozene_soubory .= "<li>" . $attr_attachment['name'] . "<ol>";
                    // vezmu jméno
                    foreach ($hodnota_attachment->item as $hodnota_attachment_item) {
                        // rozsekání xml
                        $attr_attachment_item = $hodnota_attachment_item->attributes();
                        if ($attr_attachment_item['type'] == "object") {
                            $prilozene_soubory .= "<li type = 'disc'>" . $hodnota_attachment_item . "<br />" .
                                $attr_attachment_item['src'] . "</li>";
                        } else {
                            $prilozene_soubory .= "<li type = 'disc'><a target='_blank' href='" . $attr_attachment_item['src'] .
                                "'>" . $hodnota_attachment_item . "</a></li>";
                        }
                    }
                    $prilozene_soubory .= "</ol></li>";
                    // vymazání pomocné proměnné
                    unset($hodnota_attachment_item, $attr_attachment_item);
                }
                $prilozene_soubory .= "</ol>";
                // vymazání pomocné proměnné
                unset($hodnota_attachment, $attr_attachment);
            }
tatyalien
Profil
Nemá tedy někdo nějaký nápad, jak se to dá řešit?
Zkoušel jsem si hrát i s depth, ale asi blbě...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: