Edit: Falls es eine bessere Datenbank form gibt, welche sich einfacher abgleichen lässt als XML, bitte mich darauf aufmerksam machen. Wobei das ganze ohne SQL laufen soll.
Hallo,
Also folgendes:
Ich schreibe gerade ein Programm welches auf eine
XML im Netz zugreift und diese mit einer lokalen
XML abgleicht.
Das Problem liegt daran, das sich der Inhalt der im Netz liegenden ständig ändert, und in der Lokalen jeder Eintrag nur einmal vorkommen soll. Dazu hab ich jetzt beim auslesen der
XML jeden einzelnen Eintrag mit der kompletten Lokalen
XML verglichen.
Das problem ist dann nur das das ganze recht Prozessorlastig wird.
Bei zum Beispiel 120 Lokalen einträgen und 120 Einträgen im Netz hab ich dann schon 120² an schleifen durchgängen. Und da die Datenbank noch stark wächst über die zeit wird das dann schnell nciht mehr Funktionieren.
Das ganze ist folgendermaßen gelöst:
Delphi-Quellcode:
[...]
while assigned(n)
do begin
[...]
{Der Teil hier befindet sich in der Prozedur zum auslesen der XML im Web}
if cfg.entry4=true
then begin
if FileExists((GetShellFolder(CSIDL_APPDATA)+'
\test\cach.xml'))=false
then begin
form1.xmldoc2.Active:=true;
form1.xmlDoc2.SaveToFile((GetShellFolder(CSIDL_APPDATA)+'
\test\cache.xml'));
form1.xmldoc2.Active:=false
end;
form1.xmldoc2.Active:=true;
form1.xmldoc2.loadfromfile((GetShellFolder(CSIDL_APPDATA)+'
\test\cache.xml'));
n1:=form1.xmldoc2.DocumentElement.ChildNodes.First;
while assigned(n1)
do begin
{überprüfung der der Einträge in der Lokalen XML mit der im Web}
if n1.childnodes['
entry1'].text=entry1
then begin
{Falls, vorhanden Aktuallisieren}
n1.childnodes['
entry2'].text:=entry2;
n1.childnodes['
date'].text:=FormatDateTime('
dd.mm.yy hh:mm:ss',FileDateToDateTime(it));
i4:=true;
end;
n1:=n1.NextSibling;
end;
{Falls nicht vorhanden, wird der Eintrag der Lokalen hinzugefügt.}
if i4=false
then begin
newentry := form1.xmlDoc2.DocumentElement.AddChild('
character');
newentry.AddChild('
entry1'); newentry.AddChild('
entry2');
newentry.AddChild('
entry3');newentry.AddChild('
entry4');
newentry.AddChild('
entry5');newentry.AddChild('
date');
newentry.ChildNodes['
entry1'].text:=name1;
newentry.ChildNodes['
entry2'].text:=level1;
newentry.ChildNodes['
entry3'].text:=class1;
newentry.ChildNodes['
entry4'].text:=race1;
newentry.ChildNodes['
entry5'].text:=playerid;
newentry.ChildNodes['
date'].text:=FormatDateTime('
dd.mm.yy / hh:mm:ss',FileDateToDateTime(it));;
end;
form1.xmldoc2.SaveToFile((GetShellFolder(CSIDL_APPDATA)+'
\test\cache.xml'));
form1.xmldoc2.Active:=false;
i4:=false;
end;
[...]
n:=n.NextSibling;
end;
[...]
Der Prozesssorleistungsaufwendige teil ist eben die Synchronisation mit der lokalen Datenbank.
Und das würde mit wachsender Datenbank ziemlich Zeitaufwendig werden.
Gibt es da eine Lösung das ganze etwas weniger Prozessorlastig zu erstellen.
Bin mit
XML noch nicht so vertraut. Falls es da möglichkeiten gibt da Dinge zu verkürzen etc, könnt ihr mich gerne darauf aufmerksam machen.
Vielen dank im Vorraus.
(Ich werd mich wahrscheinlich vor 12 Uhr nicht mehr hier melden)
~x3m