php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
DB nach XML auf grundlage einer dtd


 
m@localhorst
03-06-2006, 12:20 
 
Hallo,
gleich die nächste Frage von mir.
Ich habe die Aufgabe (wie schon beschrieben) (http://www.php-resource.de/forum/showthread.php?s=&threadid=71278), eine Access Produktdatenbank, in ein standardisiertes XML Format zu bekommen, das ganze ist eine lokale angelegenheit, also nix Webserver, läuft über die Kommandozeile.

Die XML Spezifikation, steht als DTD zur Verfügung, wie stellt man das optimalerweise an, das ich die xml datei nicht im PHP script, mit einer langen liste von
xmlwriter_write_element ($memory,'NAME',$header[kunden_name]);
Anweisungen erzeuge, sondern mit einer funktion arbeiten kann, welche die DTD interpretieren kann (also Feldtypen etc. auswertet, die in der DTD stehen).
So stelle ich mir das irgendwie vor, nur wie mappe ich die Tabellenspalten auf die XML Felder? und das ist leider nicht mit <produkt>Produktname</produkt> getan, sondern das sind recht komplexe abfragen etc.

ich bin im Moment soweit, das ich mir erstmal alle benötigten daten der DB, in ein Array schreiben lasse.
das könnte ich jetzt zu fuss mit den xmlwriter funktionen einrichten, aber da das ganze variabel sein sollte, (also wenn sich die spezifikation und damit die dtd ändert) dachte ich mir, ich muss doch die dtd gleich verwenden können + mapping auf die DB.

Ich benutze übrigens PEAR und könnte auch XML_QUERY2XML verwenden.
Jedoch kam ich nicht gleich damit zurecht bzw. weiss ich noch nicht ob es meinen anforderungen genügt, weil es eben sehr viele verschiedene Abfragen gibt.

Wie sieht das eigendlich mit der Performance aus? bei 50000 Datensätzen, wie kann man das optimieren, es dauert schon erstmal ganzschön das array zu erzeugen.
Und das bricht auch irgendwann ab, weils zu lange dauert. (max exec time hab ich in der ini schon hochgesetzt)

$res2 =& $db->query("SELECT * FROM PublicItems WHERE lieferantenid ='IDT'");
// Schreibe Artikel Daten in Array.
$i=0;
while ($res2->fetchInto($row[])) {
//schreibe jede Zeile in ein Array
foreach ($row[$i++] as $key => $value) {
$items[$i][$key] = $value;
}
}
# DEBUG: DB Array anzeige/ausgabe #################
print_r($items);
$dump=var_export($items, true);
file_put_contents ("vardump-items.txt", $dump);
# #########################################

Ich weiss, der SELECT * ist nicht optimal, ändere ich aber noch auf die genauen spalten.
Kann ich die executionTime messen? (bestimmt, nur wie)

Danke für Hinweise.
beste grüße
marcus


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:08 Uhr.