Sehr großes XML-File einlesen
web4free
- php
Hallo Leute,
ich probiere es mal hier, weil ich immer wieder auf dieses Forum stoße und immerwieder helfende Antworten finde.
Mein Problem ist ein XML-File welches 23MB groß ist.
Ich hab auch schon verzweifelt nach einer Lösung für das Blockweise einlesen gesucht aber nix gefunden.
Das XML-File komplett einzulesen wäre irrsinn und funzt auch nicht weil die 23MB einfach zu groß sind um alles in eine Variable packen zu können.
Der Aufbau des XML-Files schaut so aus:
<?xml version="1.0" encoding="iso-8859-1"?>
<BMECAT version="1.2">
<HEADER>
<CATALOG>
<LANGUAGE>deu</LANGUAGE>
<CATALOG_ID>d7_20050728042001</CATALOG_ID>
<CATALOG_VERSION>CATALOG_VERSION</CATALOG_VERSION>
<CATALOG_NAME>d7_20050728042001</CATALOG_NAME>
<CURRENCY>EUR</CURRENCY>
</CATALOG>
<SUPPLIER>
<SUPPLIER_ID type="supplier_specific">31</SUPPLIER_ID>
<SUPPLIER_NAME>distribution7 / Göckel GmbH</SUPPLIER_NAME>
<ADDRESS type="supplier">
<NAME>distribution7 / Göckel GmbH</NAME>
<STREET>Ölbergstr. 24</STREET>
<ZIP>72501</ZIP>
<CITY>Gammertingen</CITY>
<COUNTRY>D</COUNTRY>
</ADDRESS>
</SUPPLIER>
</HEADER>
<T_NEW_CATALOG prev_version="1">
<ARTICLE mode="new">
<SUPPLIER_AID>1-obn339359465-1108010</SUPPLIER_AID>
<ARTICLE_DETAILS>
<MANUFACTURER_NAME>MICHELIN</MANUFACTURER_NAME>
<ARTICLE_STATUS type="new">1</ARTICLE_STATUS>
<DESCRIPTION_SHORT>Kurzbeschreibung 1</DESCRIPTION_SHORT>
<DESCRIPTION_LONG>Lange Beschreibung 1</DESCRIPTION_LONG>
<KEYWORDS></KEYWORDS>
<REMARKS>Rückgaberichtlinien 1</REMARKS>
</ARTICLE_DETAILS>
<ARTICLE_ORDER_DETAILS>
<ORDER_UNIT>PK</ORDER_UNIT>
<CONTENT_UNIT>C62</CONTENT_UNIT>
<NO_CU_PER_OU>1</NO_CU_PER_OU>
</ARTICLE_ORDER_DETAILS>
<ARTICLE_PRICE_DETAILS>
<ARTICLE_PRICE price_type="net_list">
<PRICE_AMOUNT>22.7353</PRICE_AMOUNT>
<PRICE_CURRENCY>EUR</PRICE_CURRENCY>
<TAX>0.16</TAX>
</ARTICLE_PRICE>
</ARTICLE_PRICE_DETAILS>
<MIME_INFO>
<MIME>
<MIME_TYPE>image/jpeg</MIME_TYPE>
<MIME_SOURCE>http://www.bilderurl.xx</MIME_SOURCE>
<MIME_ORDER>1</MIME_ORDER>
</MIME>
</MIME_INFO>
</ARTICLE>
<ARTICLE_TO_CATALOGGROUP_MAP>
<ART_ID>3-obn339359465-1108010</ART_ID>
<CATALOG_GROUP_ID>31</CATALOG_GROUP_ID>
</ARTICLE_TO_CATALOGGROUP_MAP>
</T_NEW_CATALOG>
</BMECAT>
Sorry den langen Source **lol**
Meine eigendlichen Daten stehen nun zwischen <ARTICLE mode="new"> und </ARTICLE> sowie zwischen <ARTICLE_TO_CATALOGGROUP_MAP> und </ARTICLE_TO_CATALOGGROUP_MAP>
Dabei kann <ARTICLE mode=".... den Zustand new, update od. delete beinhalten.
So und das wiederholt sich jetzt ca. 8.000 - 10.000 mal.
Leider habe ich auf das XML-File keinen Einfluß, weil es so vom Kunden kommt.
Wie bitte komm ich hier zu meinen Daten ohne dass mir der Server jedesmal ko geht?
Für eine Hilfe wäre ich sehr dankbar!
lg.
Werner
Hallo!
Mein Problem ist ein XML-File welches 23MB groß ist.
Ich hab auch schon verzweifelt nach einer Lösung für das Blockweise einlesen gesucht aber nix gefunden.
Hierfür benötigst Du einen "Stream" Parser, der die Datei in kleinen Portionen abarbeitet. Für PHP gibt es hier SAX, und inzwischen die deutlich einfachere API xmlReader. Letztere allerdings erst ab PHP 5.1 in der Standard PHP-Distribution. Für PHP 5.0 gibt es eine PHP-Extension in PECL (Installationsanleitung).
Wie xmlReader funktioniert kannst Du am besten in den Beispielen im CVS, so wie
einigen Postings und Slides (ff.) von Christian Stocker, der diese Extension entwickelt hat, nachlesen.
Grüße
Andreas
Hallo erstmal!
Warumso kompliziert? Warum nutzt du nicht einfach eine Datenbank wie MySQL(Sogar OpenSorce),da sind 20000 Einträge noch gar nichts!
Gruß Herbert
Hallo!
Warumso kompliziert? Warum nutzt du nicht einfach eine Datenbank wie MySQL(Sogar OpenSorce),da sind 20000 Einträge noch gar nichts!
Vielleicht weil sich Katalogdaten besser in einem standardisierten XML-Format wie BMECAT zwischen verschiedenen Anwendungen und Unternehmen austauschen lassen, als Daten in einer MySQL-Datenbank? Solche Katalog-Daten kommen oft aus Desktop-Anwendungen, die nichts mit MySQL oder ähnlichem am Hut haben. Sachen wie BMECAT sind IMHO optimale Anwendungsbereiche für XML - im Gegensatz zur Datenhaltung in Foren (IMHO) ;-)
Grüße
Andreas