Entwickler-Ecke
Datenbanken - [XML] Lösungsvorschläge für mehrere Probleme
mexx - Do 17.08.06 12:56
Titel: [XML] Lösungsvorschläge für mehrere Probleme
Guten Tag,
Einleitung
da sich keiner findet meine Freeware zu testen und mit mir verschiedene Problem zu erörtern, mache ich diesen Beitrag auf, um ganz geziel auf logische und technische Probleme zu kommen.
Idee
Ein variables Programm, welches die Daten aus einer FireBird in XML-Files schreibt.
Was ist bisher da?
Der Erfolg scheint zu greifen nah. Hier einmal ein Ausschnitt einer XML-File einer Tabelle, welche Zeitmodelle einer Zeitwirtschaft enthält.
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <?xml version="1.0" ?> - <PERSONAL_ZEITMODELL VALUE_TYP="U_INTEGER"> - <KEY11 SCHLUESSELNAME="ZEITMODELL" SCHLUESSEL="11"> <ZEITMODELL VALUE_TYP="U_INTEGER">11</ZEITMODELL> <BEZEICHNUNG VALUE_TYP="U_CHAR_60">Angestellte 42 h Hainchen</BEZEICHNUNG> <BESCHREIBUNG VALUE_TYP="U_TEXT">Hainchen</BESCHREIBUNG> <SOLLZEIT_TAG VALUE_TYP="U_DOUBLE_PRECISION">0,4</SOLLZEIT_TAG> <UEZEIT_RUNDEN_AUF VALUE_TYP="U_DOUBLE_PRECISION">1,15740740740741E-5</UEZEIT_RUNDEN_AUF> <RUNDUNG_NG VALUE_TYP="U_DOUBLE_PRECISION">0</RUNDUNG_NG> <RUNDUNG_NK VALUE_TYP="U_DOUBLE_PRECISION">0</RUNDUNG_NK> <RUNDUNG_VG VALUE_TYP="U_DOUBLE_PRECISION">0</RUNDUNG_VG> <RUNDUNG_VK VALUE_TYP="U_DOUBLE_PRECISION">0</RUNDUNG_VK> <VERGUETUNGSART VALUE_TYP="U_SMALLINT">1</VERGUETUNGSART> <SCHICHTEN VALUE_TYP="U_INTEGER">1</SCHICHTEN> </KEY11> </PERSONAL_ZEITMODELL> |
bestehendes Problem
Ziel ist es ja, die Baumstruktur der XML-File so zu nutzen, dass jeder Schlüssel eine Knoten darstellt. Doch wie macht man dies Variabel?
Ich habe den Namen und die Anzahl der Schlüssel auf einer Tabelle. Das ist schon mal gut.
Meine Idee war: Eine große case-Anweisung zu nehmen, die 10 Einträge enthält. In den Anweisungsblöcken werden die Knoten geschaffen und die Selektanweisung auf die Daten des jeweiligen Schlüssels gemacht. Aber diese Methode finde ich sehr unvorteilhaft und unübersichtlich.
Wie kann man das Erstellen der Knoten, welches die Schlüssel darstellt, und die SQL-Anweisung auf die Daten des Schlüssels variabel machen?
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
UGrohne - Mo 28.08.06 08:37
Ich verstehe gerade Dein Vorgehen nicht so ganz. Du willst also in einem Ast jeweils den Tabellennamen und in x weiteren Ästern darunter die Daten des Primary Keys und in diesem Ast dann die restlichen Datensatz-Daten speichern?
Das wäre doch dann kein Problem, Du brauchst ja nur bei jedem neuen Datensatz einfach nur einen neuen Ast zu öffnen und darunter dann die restlichen Felder anzulegen.
BTW: Ich würde die Meta-Daten (also Daten über den Feldtyp) in einem extra Ast (z.B. Meta) speichern, sonst hast Du redundante Daten ohne Ende. Außerdem hast Du dann die Möglichkeit beide Teile separat zu behandeln, also z.B. einmal Datenbankstruktur erstellen und einmal Daten importieren.
mexx - Mo 28.08.06 09:37
Für jeden Key in der Tabelle wird ein Knoten erstellt. Unter dem Knoten dann entweder der nächste Knoten, dessen Priorität eine Stufe drunter steht, oder wenn es der letzte Knoten/Key der Tabelle ist, die Daten inkl. Metadaten.
Das Problem bestand darin, die Inhalte der letzten Knoten/Schlüssel zu selektieren, um sie dann in den Knoten einzutragen. Anhand er Schlüssel, muss eine SQL-Anweisung erzeugt werden, die alle vorhanden Schlüssel-Werte durchläuft. Die selektierten Daten werden mit einer While-Schleife in den erstellten Knoten geschrieben. Auch das Erstellen dieser Knoten musste dementsprechend variabel sein.
Es funktioniert auch alles. Es genügt ein Auswählen der Tabelle und los gehts. Die Schlüssel werden gesucht, die SQL-Anweisung zum selektieren der Inhalte auf die Schlüssel wird erzeugt, die Knoten werden estellt, die Inhalte eingefügt, die Metadaten eingefügt. Am Ende steht eine XML-File deren Baumstruktur die logischen Verknüpfungen in der Tabelle wiederspiegelt. Logische Verknüpfungen meine ich die Schlüssel und Schlüsselproiritäten.
Aber, die XML-File wird im laufenden Prozess im Arbeitsspeicher geschrieben. Sie wird erst gespeichert, wenn die Tabelle vollständig ausgelesen ist. Ist die Tabelle aber sehr groß(>100.000 Datensätze) wird nicht nur die XML-Datei sehr groß. Auf meinen Testserver sind nur 1GB RAM und <2GB Plattenplatz. Sowohl RAM als auch virtueller Speicher sind mitten im Prozess voll und somit kann die Anwendung nicht weiter machen. Also, wenn man eine große Tabelle mit vielen Schlüsseln und Inhalten tranferieren will, braucht man eine hohe Plattenkapazität um den virtuellen Arbeitsspeicher ausnutzen zu können. Oder kennst Du eine andere Lösung der Speicherverwaltung?
Delete - Sa 03.02.07 17:34
ja als flat file behandeln und selbst einlesen.
das mit dem speicher und der ganzen datei einlesen, ist systembedingt. da ein grundsatz für 'n xml parser so lautet, dass wenn ein fehler in der xml datei ist, ist das ganze abzulehnen. somit muss er das ganze erst mal einlesen. ggf. findest du 'ne andere implementation, welcher nur den zu bearbeitenden bereich im speicher behält. ich kenn zur zeit keinen...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!