![]() |
In XML-Datei Werte speichern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich bin absoluter Neuling in Sachen XML :roll: und habe folgendes Problem: Ich lese eine XML-Datei in ein TreeView ein. Nun ändere ich Werte im TreeView. Wie kann ich die Änderung in die XML-Datei zurückschreiben ? :gruebel: In der Procedure "RefreshXML" lasse ich mir mit Hilfe der Function "AXMLDocument.ChildNodes.FindNode(ANodeName)" ein XMLNode geben. Nur ist der XMLNode immer NIL. Ist der NodeName vielleicht verkehrt? :?: Zum besseren Verständnis habe ich das Projekt als Anhang hinzugefügt. Das Projekt ist mit Delphi2005 erstellt. Gruß Woto |
Re: In XML-Datei Werte speichern
Hallo Wolfgang,
was hast du vor? Möchtest du die Knoten der TreeView direkt editieren und dann die Änderungen per RefreshXML in das XML-Dokument übernehmen? Das ist keine gute Idee, finde ich. Die TreeView sollte dir lediglich Zugang zum XML-Dokument verschaffen, deine Änderungen sollten dort eingetragen werden und danach sollte die TreeView - als rein visuelle Komponente - aktualisiert werden. Es gibt bei der Gestaltung von XML-Dokumenten ein uraltes Problem, über dass sich jeder irgendwann Gedanken machen muss: soll eine Information als Attributwert oder als Elementinhalt gespeichert werden. Diese Entscheidung sollte nie leichtfertig getroffen werden, da sie Auswirkungen auf die Überlebensfähigkeit des Codes hat. Im von dir verwendeten XML-Dokument scheinen mir nur Attribute zu existieren, die du ohne Unterscheidung zu Elementen in die TreeView einbaust. Du versuchst den Pfadnamen deines Knoten zur Verwendung in FindNode() aufzubauen. Der dabei verwendete Backslash ist im Filesystem angebracht, in XPath-Ausdrücken wird ein Slash verwendet. Dabei gehst du in deiner WHILE-Schleife davon aus, dass ab Level 2 ein Attribut-Knoten vorliegt. Attribut-Knoten können aber in deinem XML-Dokument auf verschiedenen Ebenen auftreten. In deiner TreeView trägst du aus diesen Gründen nur die Attribute der Elemente ein, die keine Unterelemente mehr besitzen. Diese Einschränkung wirst du sicher nicht durchhalten, aber im Augenblick solltest du dann auch das Editieren nur auf Blattknoten zulassen. Ich habe deinen Code nur minimal überarbeitet, damit der von dir beschriebene Fehler verschwindet. Ich hoffe du siehst die Änderungen.
Delphi-Quellcode:
Freundliche Grüße vom marabu
// ...
var de: IDOMElement; // ... // Parents sammeln und in einer StringList speichern if ATreeNode.Parent <> nil then begin HelpTreeNode := ATreeNode.Parent; repeat AStringList.Insert(0,HelpTreeNode.Parent.Text); HelpTreeNode := HelpTreeNode.Parent; until HelpTreeNode.Level = 0; // NodeName zusammenstellen ANodeName :=''; for i := 0 to Pred(AStringList.Count) do begin ANodeName := ANodeName + AStringList.Strings[i]; if i <> Pred(AStringList.Count) then ANodeName := ANodeName + '/'; end; // XML-File beschreiben with AXMLDocument.DocumentElement.DOMNode as IDOMNodeSelect do begin de := SelectNode(ANodeName) as IDOMElement; if Assigned(de) then de.setAttribute(ATreeNode.Parent.Text, ATreeNode.Text); end; end; // ... |
Re: In XML-Datei Werte speichern
Hallo Marabu, :hi:
vielen Dank für deine ausführliche Antwort und deine Lösung zum Problem. Du hast natürlich Recht, daß prinzipiell das TreeView nur zur Anzeige dienen sollte. Generell sollten alle Programme in drei Schichten aufgeteilt werden: - View-Klassen - Controler-Klassen - Entity-Klassen Ich werde dies für dieses Programm auch noch tun und komplett überarbeiten. Ich brauchte nur auf die schnelle eine Möglichkeit, um die XML-Datei einlesen und ändern zu können. Da meine Freizeit sehr knapp bemessen ist, kann dies allerdings noch etwas dauern. Wenn ich damit fertig bin, werde ich das Programm mit Quellcode zum Download bereitstellen. einen schönen Tag noch, :hi: Woto |
Re: In XML-Datei Werte speichern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
in der von Marabu vorgestellten Lösung gibt es ein Problem, wenn die Nodes nicht eindeutig sind. Soll heißen, wenn die Verzweigungen im XML-File nicht eindeutig unterscheidbar sind. :!: Mit dieser Version ist dieses Problem gelöst. Ich speichere mir den Pointer der Nodes im Data-Property des TreeView. Ändere ich nun ein Attributwert, so lade ich mir anhand des Pointers im Data-Property die Interfaceadresse. Diese verwende ich dann, um die Änderung an die richtige Stelle im XML-File zu schreiben. Das angehängte Projekt erhebt keinesfalls den Anspruch der Vollständigkeit in Bezug auf ein für alle XML-Files funktionierendes Tool, aber vielleicht hilft es den einen oder den anderen ein wenig. :lol: bis denne, Woto |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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