Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Wie Node verschieben? Empfehlung für Parser (https://www.delphipraxis.net/175989-wie-node-verschieben-empfehlung-fuer-parser.html)

BBoy 5. Aug 2013 12:57

Wie Node verschieben? Empfehlung für Parser
 
Wie kann ich eine Node verschieben, also sozusagen die Reihenfolge neu anordnen?

Derzeit habe ich mich noch nicht für ein XML Parser entscheiden. Hatte immer NativeXML genutzt aber der funzt mit XE2 nicht mehr. Die neueren Versionen sind scheinbar buggy, jedenfalls funktionieren dann meine alten Projekte nicht mehr.

Könnt ihr mir einen guten einfachen Parser empfehlen? Ansprüche habe ich eigentlich keine, wäre schön wenn es eine .move funktion geben würde :)

Wenn ich die Daten in ein Grid einlesen möchte, dann muss ich das in einer schleife für jede einzelne node? Und umgekehrt dann genauso, oder gibts da was einfacheres?

Der schöne Günther 5. Aug 2013 13:13

AW: Wie Node verschieben? Empfehlung für Parser
 
Ich kenne nichts anderes als MSXML, also das, was normal schon unter Xml.XmlIntf und Xml.XmlDoc ist.

Verschieben so als einzelne Methode gibt es meines Wissens nach nicht, aber das ist ja nichts anderes als ein AddChild(..) nach dort wo du es hinhaben willst und Entfernen aus der Liste in der es nicht mehr sein soll.

Ich kenne nichts anderes, bislang aber mit dem Kram sehr gut gefahren :-)
Parsen, verändern und wieder schreiben (auch mit Einrückungen für bessere Lesbarkeit) klappt alles fehlerfrei.

ConnorMcLeod 5. Aug 2013 13:17

AW: Wie Node verschieben? Empfehlung für Parser
 
Bin mit JvSimpleXml immer zufrieden gewesen.

jaenicke 5. Aug 2013 13:21

AW: Wie Node verschieben? Empfehlung für Parser
 
Ich benutze ganz normal den mit Delphi mitgelieferten... (Unit msxml)
Einziges Problem war, dass auf Embedded Systemen die entsprechende Windowskomponente nicht vorinstalliert ist, aber die gibt es auch separat zum Nachinstallieren.

Verschieben eines Knotens (inkl. Unterknoten) geht ganz einfach mit appendChild.

BBoy 5. Aug 2013 13:31

AW: Wie Node verschieben? Empfehlung für Parser
 
Habe das nun so realisiert:
Delphi-Quellcode:
var
node_old : ixmlnode;
node_new : ixmlnode;
begin
node_old := nodes.Nodes[1];   // Name
node_new := nodes.Nodes[2];   // Vorname
nodes.Delete(2);
nodes.Insert(1,node_new);
end;
Somit wird Vorname VOR Name gesetzt. Das funktioniert auch so.
Nun ergibt sich aber noch folgendes Problem. Ich möchte die XML in ein GRID einlesen. Und dort die Datensätze eventuell neu anordnen. Beim speichern soll dann das Grid gelesen werden und die neue anordnung gespeichert werden. Wie kann ich das realisieren?

Der schöne Günther 5. Aug 2013 15:35

AW: Wie Node verschieben? Empfehlung für Parser
 
Dass jemandem die Reihenfolge der Knoten auf gleicher Ebene wichtig war habe ich ehrlich gesagt noch nie gesehen. Wenn man einen Knoten sucht, dann doch nicht über die Position an welcher er steht, sondern über den Namen.

Ich kenne mich mit den VCL-Komponenten noch nicht so wirklich aus, aber bei vielen kann man an einen Eintrag doch ein Objekt koppeln. Jeder Eintrag in deiner Grid-Komponente wäre doch eine IXMLNode. Dann kannst du doch jede Zeile durchgehen, einem neuen IXMLDocument hinzufügen und das Teil dann am Schluss speichern...

BBoy 5. Aug 2013 15:38

AW: Wie Node verschieben? Empfehlung für Parser
 
Die Reihenfolge ist wichtig, da es sich um eine sortierte Liste handelt die als xml gespeichert/geladen werden soll.
Sagen wir einfach es wäre eine ToDo Liste, die wichtigen Dinge oben usw....

Der schöne Günther 5. Aug 2013 15:43

AW: Wie Node verschieben? Empfehlung für Parser
 
Naja, wenn es denn eindeutig sortiert ist, hätte ich jedem Eintrag doch explizit auch seine Reihenfolge als Attribut mitgegeben.

Wenn ich persönlich die XML nun bearbeiten würde hätte ich mir keine Gedanken gemacht, die Reihenfolge beizubehalten.

jaenicke 5. Aug 2013 19:06

AW: Wie Node verschieben? Empfehlung für Parser
 
Zitat:

Zitat von BBoy (Beitrag 1223568)
Die Reihenfolge ist wichtig, da es sich um eine sortierte Liste handelt die als xml gespeichert/geladen werden soll.

Dafür die Reihenfolge in der Datei zu nutzen ist eine der schlimmsten Unarten, die ich bei XML bisher gesehen habe...

Die Sortierung ist eigentlich in der Datei doch nicht relevant, sondern nur, wenn du die Daten anzeigst. Und die Anzeige hat mit dem Dateiinhalt direkt ja nichts zu tun.

Wenn du die Daten z.B. in einer TVirtualStringTree anzeigst, musst du nur OnCompareNodes implementieren (wo du nur angeben musst wie zwei Knoten zueinander stehen), den Rest macht die alleine. Das geht auch sehr schnell.
Auch Attribute wie bereits genannt kann man dafür nehmen, wenn man die Reihenfolge auch in der Datei reflektiert haben möchte.

BBoy 5. Aug 2013 20:44

AW: Wie Node verschieben? Empfehlung für Parser
 
Zitat:

Wenn du die Daten z.B. in einer TVirtualStringTree anzeigst, musst du nur OnCompareNodes implementieren (wo du nur angeben musst wie zwei Knoten zueinander stehen), den Rest macht die alleine. Das geht auch sehr schnell.
Auch Attribute wie bereits genannt kann man dafür nehmen, wenn man die Reihenfolge auch in der Datei reflektiert haben möchte.
Wie das funktionieren soll kann ich mir überhaupt nicht vorstellen.

Zitat:

Dafür die Reihenfolge in der Datei zu nutzen ist eine der schlimmsten Unarten, die ich bei XML bisher gesehen habe...
tja, so sind laien eben :) Das war das erste wo mir eingefallen ist. Ich speicher die Nodes in der Reihenfolge wie sie später gelesen werden und die für mich wichtig ist. Weiß nicht was daran so abwegig ist. Damit spare ich mir spätere Abfragen und Sortierungen.
Ich könnte auch eine weitere node verwenden mit der Sortierreihenfolge die beim einlesen der Datei berücksichtigt wird. Aber auch da müsste ich beim lesen weitere routinen schreiben die das in die richtige Reihenfolge bringen. Bei meiner Methode spare ich mir das alles. Da es sich dabei um recht kleine Dateien handelt, funktioniert das gut :)

Oder gibt es andere Gründe die dagegen sprechen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Seite 1 von 2  1 2      

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