AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

XML sortieren

Ein Thema von Lee500 · begonnen am 28. Jun 2008 · letzter Beitrag vom 29. Jun 2008
Antwort Antwort
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#1

XML sortieren

  Alt 28. Jun 2008, 22:03
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.
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#2

Re: XML sortieren

  Alt 29. Jun 2008, 09:59
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: XML sortieren

  Alt 29. Jun 2008, 10:58
Moin,

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
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#4

Re: XML sortieren

  Alt 29. Jun 2008, 12:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#5

Re: XML sortieren

  Alt 29. Jun 2008, 12:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#6

Re: XML sortieren

  Alt 29. Jun 2008, 12:56
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: XML sortieren

  Alt 29. Jun 2008, 14:27
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
  Mit Zitat antworten Zitat
Benutzerbild von Lee500
Lee500

Registriert seit: 18. Sep 2006
39 Beiträge
 
Delphi 2010 Architect
 
#8

Re: XML sortieren

  Alt 29. Jun 2008, 16:27
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz