Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie in XML-Datei sortieren? (https://www.delphipraxis.net/46747-wie-xml-datei-sortieren.html)

toko 30. Mai 2005 20:33


Wie in XML-Datei sortieren?
 
Hallo,

ich bin es mal wieder. Ich kann nun sauber in meiner XML-Datei Knoten/Attribute lesen und schreiben.
(Danke noch mal an MathiasSimmack :thumb: )
Die Daten schreibe ich dabei durch meine Anwendung sofort in diese Datei:
XML-Code:
<?xml version="1.0"?>
<cdorganizer>
   <cd id="1" titel="g testcd1" interpret="testinterpret1" genre="genre1">
   <track id="1" titel="testtrack1" interpret="testinterpret1" dauer="11:11:11"/>
   <track id="2" titel="testtrack2" interpret="testinterpret2" dauer="11:11:12"/>
   <track id="3" titel="testtrack3" interpret="testinterpret3" dauer="11:11:13"/>
   <track id="4" titel="testtrack4" interpret="testinterpret4" dauer="11:11:14"/>
   <track id="5" titel="testtrack5" interpret="testinterpret5" dauer="11:11:15"/>
   </cd>
   <cd id="2" titel="f testcd2" interpret="testinterpret2" genre="genre2"></cd>
   <cd id="3" titel="e testcd3" interpret="testinterpret3" genre="genre3"></cd>
   <cd id="4" titel="d testcd4" interpret="testinterpret4" genre="genre4"></cd>
   <cd id="5" titel="c testcd5" interpret="testinterpret5" genre="genre5"></cd>
   <cd id="6" titel="b testcd6" interpret="testinterpret6" genre="genre6"></cd>
   <cd id="7" titel="a testcd7" interpret="testinterpret7" genre="genre7"></cd>
</cdorganizer>
In der Anwendung selbst werden die CD's dann in einem TStringGrid dargestellt. In einem zweiten TStringGrid werden zu einer markierten CD die Tracks dargestellt.
Ich möchte nun die Daten alphabetisch sortieren.

Geht das ohne Benutzung von Listen? Wenn ja, bin ich für jeden Tipp sehr dankbar. Wenn nein, dann hab ich das Problem der Listenbenutzung hier versucht zu beschreiben.
Kann ich eventuell den Sortieralgorithmus "Sort" von TStringList/TList verwenden?
Mir stellt sich jedoch die Frage, was dann mit der/den Liste/Kindknoten zu einer CD passiert?

Falls ich mich unverständlich ausdrücke, bitte ruhig melden, dann erläutere ich das Thema genauer.

Gruß

[edit=Matze]Beitrag aufgrund eines Caching-Fehlers neu abgesendet. MfG, Matze[/edit]

MathiasSimmack 30. Mai 2005 20:51

Re: Wie in XML-Datei sortieren?
 
Was möchtest du sortieren? Die Daten im Programm? Oder die Daten in der XML-Datei?

toko 30. Mai 2005 22:50

Re: Wie in XML-Datei sortieren?
 
:gruebel: wenn ich so recht überlege brauche ich gar nicht die Daten in der XML-Datei zu sortieren, sondern nur die im TStringGrid.
Es soll mit der Sortierung einfach nur eine übersichtlichere Art des Lesens erreicht werden.

Ok, also ich möchte die Daten im Programm sortieren.

marabu 31. Mai 2005 08:02

Re: Wie in XML-Datei sortieren?
 
Hallo toko,

deine über DOM zugänglichen internen XML-Daten könntest du mit XSLT umsortieren. Dazu musst du nur xsl:sort in eine identity transformation verpacken. So sieht das dann aus, wenn du nach "titel" sortieren willst:

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()">
        <xsl:sort select="@titel"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
Wenn deine XML-Daten in xmlDoc bereit stehen und dieses Skript in xmlStyle, dann wird die Sortierung deiner XML-Daten durch folgenden Aufruf durchgeführt:

Delphi-Quellcode:
xmlDoc.loadXML(xmlDoc.transformNode(xmlStyle));
Grüße vom marabu

alcaeus 31. Mai 2005 08:05

Re: Wie in XML-Datei sortieren?
 
Zitat:

Zitat von toko
:gruebel: wenn ich so recht überlege brauche ich gar nicht die Daten in der XML-Datei zu sortieren, sondern nur die im TStringGrid.

Ganz genau. Und wenn du statt dem StringGrid auch noch eine ListView verwendest, kannst du mit Hilfe dieses Codes die Sortierung waehrend der Laufzeit aendern. Die Anordnung der Daten in der Datei sollte naemlich nichts mit jener im Programm zu tun haben, jedenfalls nicht bei deinem Beispiel ;)

Greetz
alcaeus

toko 31. Mai 2005 09:54

Re: Wie in XML-Datei sortieren?
 
Hi,

danke für eure Beiräge. Ich werde beide Variante mal heute abend probieren :coder: . Ich lasse jedoch dieses Thema so lange offen, falls sich noch meinerseits Fragen ergeben.

Gruß

toko 31. Mai 2005 23:40

Re: Wie in XML-Datei sortieren?
 
Hallo,

@alcaeus
Ich habe mir überlegt erst mal die Variente von marabu zu probieren. Da es eine Forderung ist meine Daten in einem TStringGrid darzustellen.
Da ich auch ziemlich weit mit der Programmierung fortgeschritten bin, ist es etwas mühsam die Grids und die darauf aufbauenden Funktionen auf ListViews umzustellen. Ich behalte es aber im Hinterkopf.

@marabu
Zitat:

Dazu musst du nur xsl:sort in eine identity transformation verpacken.
:wiejetzt: Wie mache ich das genau? Wo muss ich diesen Code
Delphi-Quellcode:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()">
        <xsl:sort select="@titel"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
abspeichern? Muss ich dafür eine .XSL-Datei mit selben Namen wie die XML-Datei anlegen?

Mit
Delphi-Quellcode:
xmlDoc.load(xmlfile);
lade ich übrigens meine XML-Datei. In xmlfile steht der Pfad der Datei.

Wo ist den der Unterschied zwischen "load" und "loadXML". Bei "loadXML" bekomme ich einen parseError.

Kannst du deine quasi-Anleitung etwas genauer beschreiben?
Danke...

Gruß ToKo

[edit=Matze]Beitrag aufgrund eines Caching-Fehlers neu abgesendet. MfG, Matze[/edit]

marabu 1. Jun 2005 06:49

Re: Wie in XML-Datei sortieren?
 
Hallo ToKo,

voraus schicken möchte ich, dass ich dir bei einem Teilproblem im XML-Bereich helfe, dir aber für dein Projekt wahrscheinlich einen Bärendienst erweise. Du sprichst von Anforderungen, aber es ist mir nicht klar, wer die formuliert hat - du selbst oder ein anderer. Ich fürchte, dass es einfach nur Entscheidungen sind, die du vor deinem persönlichen Erfahrungshorizont getroffen hast. Ich würde einen CD-Manager voll in die Windows Shell integrieren und das Speicherformat hätte ich wahrscheinlich von FreeDB übernommen.
Der lockere Hinweis von alcaeus an dich enthält einen Wink mit dem Zaunpfahl: Wenn du alle Funktionalität in dein Stringgrid eingebaut haben wirst, dann wird jeder Betrachter sich fragen, warum du nicht gleich eine ListView genommen hast.

Aber das alles ist dein Projekt, sind deine Entscheidungen. Kommen wir zu deinem XML-Problem.

Zitat:

Zitat von toko
Wie mache ich das genau? Wo muss ich diesen Code abspeichern? Muss ich dafür eine .XSL-Datei mit selben Namen wie die XML-Datei anlegen?

Zuerst brauchst du eine zweite Variable xmlStyle neben deiner xmlDoc Variable. Mit xmlDoc hast du deine XML-Daten geladen, xmlStyle nimmt den XSLT-Code auf. Bei mir sind beide vom Typ IXMLDOMDocument. Du musst abwägen, ob du nur eine oder mehrere Sortierungen benötigst. Wenn es nur um die eine Sortierung geht, dann kannst du den XSLT-Code in einer Datei mit der Erweiterung XSL speichern und diese mit xmlStyle.load() laden. Ich empfehle dir aber einen resourcestring fmtXSLsort zu verwenden, in dem du den für die Sortierung ausgewählten Knoten @titel durch %s ersetzt und vor dem Sortieren mit der Anweisung

Delphi-Quellcode:
xmlStyle.loadXML(Format(fmtXSLsort, ['@titel']));
lädst. Hier solltest du erkennen, dass mit load() eine Datei mit einem bestimmten URL geladen wird, während mit loadXML() ein XML-String geladen wird.

Grüße vom marabu

toko 1. Jun 2005 17:56

Re: Wie in XML-Datei sortieren?
 
Hallo marabu,

Zitat:

voraus schicken möchte ich, dass ich dir bei einem Teilproblem im XML-Bereich helfe, dir aber für dein Projekt wahrscheinlich einen Bärendienst erweise.
Das weiß ich ja auch zu schätzen.


Zitat:

Du sprichst von Anforderungen, aber es ist mir nicht klar, wer die formuliert hat - du selbst oder ein anderer. Ich fürchte, dass es einfach nur Entscheidungen sind, die du vor deinem persönlichen Erfahrungshorizont getroffen hast.
Ich programmiere diese Anwendung im Rahmen eines Wahlpflichtfachs meines Studiums, welches auch lediglich nur eine Einführung ist. Dabei hatten wir einige Komponenten und Techniken besprochen, welche wir dann in einer "simplen" CD-Verwaltung benutzen sollten. Unter anderem viel dabei der Satz: "CDs können in einer TStringGrid angezeigt werden. Ein Mausklick in der ersten Reihe einer Spalte bewirkt das Sortieren der TStringGrid nach den Daten in der Spalte." und "CDs können in einer Datei gespeichert werden, und aus dieser Datei eingelesen werden." Das ich dann XML-Dateien benutze, schien mir sinnvoller, als INI-Dateien oder "normale" Textdateien.

Zitat:

Der lockere Hinweis von alcaeus an dich enthält einen Wink mit dem Zaunpfahl: Wenn du alle Funktionalität in dein Stringgrid eingebaut haben wirst, dann wird jeder Betrachter sich fragen, warum du nicht gleich eine ListView genommen hast.
Ich wollte halt erstmal die Variante mit der XML-Sortierung testen, da ich mit der ListView-Komponente noch keine Erfahrungen gesammelt habe. Ich werde mich nachher mal damit auseinandersetzen, ob ich mit der ListView die gleichen(besseren) Eigenschaften/Methoden habe, wie(als) mit dem StringGrid. Ich denke mal, wenn ich eine sinnvollere Komponente als die StringGris eingesetzt habe, dann kann man das gegenüber dem Prof erwähnen. Wobei ich denke, dass er dann auch die Lösung mit ListView favorisieren wird.

Zitat:

Aber das alles ist dein Projekt, sind deine Entscheidungen.
Ich lasse mich gerne eines besseren belehren. Falls das anders angekommen ist, Sorry! Ich weiß, dass ich durch DP eine kompetente und schnelle Hilfe bekomme; und brauche auch so nicht noch mehr Zeit in die Anwendung investieren, als dass ich schon tue.

Wie gesagt, danke für deine/eure Hilfe.

Ich werde nun mal versuchen meine Sortiergeschichte zu lösen...
mfg

marabu 1. Jun 2005 19:07

Re: Wie in XML-Datei sortieren?
 
Zitat:

Falls das anders angekommen ist, Sorry!
Ganz und gar nicht.

Ich hatte ein schlechtes Gewissen bei meinen Vorbemerkungen, da ich unsicher war, wie ich am besten helfen kann.

Ich würde zwar die Benutzer-Oberfläche eher mit einer ListView als mit einem StringGrid gestalten, aber zum Sortieren würde ich die ListView nicht verwenden können, da ich die Daten grundsätzlich in Daten-Containern verwalte und nicht in UI-Controls.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Seite 1 von 3  1 23      

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