![]() |
XML sortieren
Hallo erstmal und sorry, dass es diesen Thread so in der Art schonmal gab (
![]() So sieht mein XML aus:
XML-Code:
Jetzt hätte ich das ganze gern nach der sumtime sortiert, was in diesem schlechten Beispiel sogar der Fall ist.
<runs name="Xanten">
<run startnr="102" sumtime="69,96"> <round time="34,29" course="1" num="1"/> <round time="35,67" course="2" num="2"/> </run> <run startnr="103" sumtime="70,62"> <round time="35,84" course="2" num="1"/> <round time="34,78" course="1" num="2"/> </run> </runs> Es wäre wirklich sehr nett, wenn Ihr das für mich Dummerchen nochmal erklären würdet. |
Re: XML sortieren
Hi,
aus welchen Zweck möchtest Du die Daten schon in der XML sortiert haben? Würde es nicht auch ausreichen, wenn Du die Daten nur bei der Darstellung (in einer ListView z.B.) sortierst? |
Re: XML sortieren
Moin,
Zitat:
Grüße vom marabu |
Re: XML sortieren
Erstmal danke für eure Antworten.
Ich hatte vor die Daten in ein mbtbxStringGrid zu schreiben, nach der Sumtime sortiert, um die Plätze davor schreiben zu können. aber ein StringGrid kann man ja nicht sortieren. Gibt es da eine andere Möglichkeit? Gruß Lee500 |
Re: XML sortieren
Natürlich kannst Du StringGrids sortieren, wobei ich selbst lieber die ListView nutze.
Zu beidem solltest Du mit ![]() ![]() |
Re: XML sortieren
Ich hab mir zu beidem etwas durchgelesen, jedoch ist beides nicht das optimale für mich. In meinen mbtbx Komponenten gibt es nämlich keine ListView-Komponente und das StringGrid zu sortieren ist was größeres. Da hab ich mir überlegt, ob ich nicht einfach die daten in einen array schreibe, und diesen dann sortiere. Jetzt zu meiner neuen Frage: Wie bekomme ich alle run-Tags in je einen Array. Klar braucht man ein record, aber ich meine, ob ich dazu ne for Schleife brauche, die alle Startnummern auf Vorhandenheit prüft, um sie dann einzutragen, oder geht das irgendwie eleganter?
Gruß Lee500 |
Re: XML sortieren
Hallo,
der Zugriff auf alle run-Elemente erfolgt über doc.DocumentElement.SelectNodes('*') - auf diese Weise musst du nicht nach iregendwelchen Startnummern suchen, die garnicht vorhanden sind. Am elegantesten erscheint mir tatsächlich ein indexsequentieller Zugriff auf die Elemente. Zwischenspeichern musst du dann eigentlich nur die Zeiger auf die einzelnen Elemente in der benötigten Reihenfolge.
Delphi-Quellcode:
Grüße vom marabu
procedure TDemoForm.ButtonClick(Sender: TObject);
var doc: IXMLDocument; i: Integer; list: TList; begin doc := CreateXmlDoc; if doc.LoadXML(Memo.Text) then begin list := CreateIndex(doc.DocumentElement.SelectNodes('*')); ListBox.Clear; for i := 0 to Pred(list.Count) do with IUnknown(list.Items[i]) as IXMLElement do ListBox.Items.Add(GetAttribute('startnr')); list.Free; end; end; |
Re: XML sortieren
Hi,
hab mir das selbst mal angeguckt und das so gelöst:
Delphi-Quellcode:
Das sortieren mache ich mit ShellSort, allerdings sortiert er den letzten Datensatz seltsamerweise nicht mit:
procedure TForm1.FillArray(klasse: string);
var EList,EList2: IXMLNodeList; I,J,K: Integer; begin SetLength(Runs,0); J := 0; EList := XPathSelect(XMLDoc.DocumentElement, '/runs/run'); if EList.Length > 0 then begin for I:=0 to EList.Length-1 do begin EList2 := XPathSelect(Drivers.DocumentElement, '/drivers/driver[@startnr="'+EList.Item[I].Attributes.GetNamedItem('startnr').NodeValue+'"]'); if EList2.Length > 0 then begin if EList2.Item[0].Attributes.GetNamedItem('class').NodeValue = klasse then begin Inc(J); SetLength(Runs,J); Runs[J-1].startnr := StrToInt(EList.Item[I].Attributes.GetNameditem('startnr').NodeValue); Runs[J-1].sumtime := StrToFloat(EList.Item[I].Attributes.GetNamedItem('sumtime').NodeValue); EList2 := XPathSelect(XMLDoc.DocumentElement, '/runs/run[@startnr="'+EList.Item[I].Attributes.GetNamedItem('startnr').NodeValue+'"]/round'); for K := 0 to EList2.Length - 1 do begin SetLength(Runs[J-1].times,K+1); Runs[J-1].times[K].time := StrToFloat(EList2.Item[K].Attributes.GetNamedItem('time').NodeValue); Runs[J-1].times[K].course := StrToInt(EList2.Item[K].Attributes.GetNamedItem('course').NodeValue); end; end else end; end; end; end; ![]() Gruß Lee500 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz