AGB  ·  Datenschutz  ·  Impressum  







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

In XML-Datei Werte speichern

Ein Thema von WoTo · begonnen am 4. Feb 2006 · letzter Beitrag vom 7. Feb 2006
Antwort Antwort
WoTo

Registriert seit: 28. Jun 2004
Ort: Rotenburg (Wümme)
102 Beiträge
 
Delphi 2005 Enterprise
 
#1

In XML-Datei Werte speichern

  Alt 4. Feb 2006, 19:11
Hallo zusammen,
ich bin absoluter Neuling in Sachen XML 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 ?

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
Angehängte Dateien
Dateityp: zip pcs7eas_133.zip (11,3 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
marabu

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

Re: In XML-Datei Werte speichern

  Alt 5. Feb 2006, 19:47
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:
// ...
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;
// ...
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
WoTo

Registriert seit: 28. Jun 2004
Ort: Rotenburg (Wümme)
102 Beiträge
 
Delphi 2005 Enterprise
 
#3

Re: In XML-Datei Werte speichern

  Alt 6. Feb 2006, 09:49
Hallo Marabu,
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,
Woto
  Mit Zitat antworten Zitat
WoTo

Registriert seit: 28. Jun 2004
Ort: Rotenburg (Wümme)
102 Beiträge
 
Delphi 2005 Enterprise
 
#4

Re: In XML-Datei Werte speichern

  Alt 7. Feb 2006, 13:12
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.

bis denne,
Woto
Angehängte Dateien
Dateityp: zip pcs7eas_175.zip (585,1 KB, 18x aufgerufen)
  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 02: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