Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML sortieren (https://www.delphipraxis.net/116409-xml-sortieren.html)

Lee500 28. Jun 2008 22:03


XML sortieren
 
Hallo erstmal und sorry, dass es diesen Thread so in der Art schonmal gab (Wie XML sortieren?). Allerdings nicht für OmniXML. Da meine Anwendung nun aber mit OmniXML schon wunderbar funktioniert, würde ich gern wissen wie man bei OmniXML die Tags nach Attributen sortieren kann.

So sieht mein XML aus:
XML-Code:
<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>
Jetzt hätte ich das ganze gern nach der sumtime sortiert, was in diesem schlechten Beispiel sogar der Fall ist.

Es wäre wirklich sehr nett, wenn Ihr das für mich Dummerchen nochmal erklären würdet.

Die Muhkuh 29. Jun 2008 09:59

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?

marabu 29. Jun 2008 10:58

Re: XML sortieren
 
Moin,

Zitat:

Zitat von Lee500
... würde ich gern wissen wie man bei OmniXML die Tags nach Attributen sortieren kann. ...

zum Sortieren brauchst du einen XSL-Processor, OmniXML scheint mir aber nur ein XML-Parser zu sein. Es ist eine Besonderheit von MSXML, dass dort Parser und XSL-Processor voll integriert sind. Du wirst das Sortieren außerhalb von OmniXML erledigen müssen.

Grüße vom marabu

Lee500 29. Jun 2008 12:27

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

Die Muhkuh 29. Jun 2008 12:30

Re: XML sortieren
 
Natürlich kannst Du StringGrids sortieren, wobei ich selbst lieber die ListView nutze.

Zu beidem solltest Du mit Hier im Forum suchenStringGrid sortieren bzw. Hier im Forum suchenListview sortieren fündig werden.

Lee500 29. Jun 2008 12:56

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

marabu 29. Jun 2008 14:27

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:
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;
Grüße vom marabu

Lee500 29. Jun 2008 16:27

Re: XML sortieren
 
Hi,

hab mir das selbst mal angeguckt und das so gelöst:
Delphi-Quellcode:
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;
Das sortieren mache ich mit ShellSort, allerdings sortiert er den letzten Datensatz seltsamerweise nicht mit: ShellSort Problem

Gruß Lee500


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf