Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Ersetzen einen Knotens (https://www.delphipraxis.net/42665-ersetzen-einen-knotens.html)

tobu 22. Mär 2005 09:58


Ersetzen einen Knotens
 
Hallo ich will in meinem XML-Dokument einen Konten ersetzten das XML sieht ungefähr so aus:
Delphi-Quellcode:
<script nummer="lfd Nummer" author="Author">
      <Beschreibung>Das ist die Beschreibung</Beschreibung>
      <Befehl>Das ist der Befehl</Befehl>
</script>
Indem Xml-Dokument gibt es mehrere Script-Knoten. Ich suche nach einer bestimmten Nummer und will dann bei diesem Knoten Beschreibung und Befehl
ändern.
Ich habe das ungefähr so gedacht:
Delphi-Quellcode:
procedure TForm1.KnotenErsetzen(Knoten: IXMLNode);
begin
  XMLDoc.LoadFromFile(XMLDoc.FileName);
  Knoten.Attributes['Nummer'] := ENummer.Text;

  case CBAuthor.ItemIndex of
  0: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[0];
  1: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[1];
  2: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[2];
  end;

  Knoten.ChildValues['Beschreibung'] := RBeschreibung.Text;
  Knoten.ChildValues['Befehl'] := RBefehl.Text;

  //Einrücken und speichern im XML-Document
  XMLDoc.Options := [doNodeAutoIndent];
  XMLDoc.SaveToFile(XMLDoc.FileName);

end;
Leider funtioniert dies nicht. Kann mir vieleicht jemand helfen?

MathiasSimmack 22. Mär 2005 11:24

Re: Ersetzen einen Knotens
 
So ganz zu Herzen genommen hattest du dir meine Kritik damals nicht, was? :mrgreen: Warum
Zitat:

Zitat von tobu
Delphi-Quellcode:
  case CBAuthor.ItemIndex of
  0: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[0];
  1: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[1];
  2: Knoten.Attributes['Author'] := CBAuthor.Items.Strings[2];
  end;

und nicht gleich:
Delphi-Quellcode:
Knoten.Attributes['Author'] := CBAuthor.Items[CBAuthor.ItemIndex];
Diese eine Zeile macht genau das gleiche wie deine case-Anweisung. :zwinker:


Dass es übrigens nicht funktioniert, liegt daran:
Zitat:

Delphi-Quellcode:
XMLDoc.LoadFromFile(XMLDoc.FileName);

XMLDoc.Options := [doNodeAutoIndent];
XMLDoc.SaveToFile(XMLDoc.FileName);

Dass da noch was dazwischen steht, interessiert nicht, weil es keinen Einfluss auf das Dokument hat, das du hier komplett neu lädst. Du musst folgendes überlegen: Du änderst zwar die Eigenschaften des Knotens, aber wo ist dabei die Verbindung zu XMLDoc?

Ich nehme mal an, dass du die XML-Datei schon beim Start deines Programms lädst. In dem Fall enthält XMLDoc das Dokument. Wenn du jetzt den Knoten in der o.g. Prozedur änderst, dann ändert sich dadurch der entsprechende Knoten im schon geladenen Dokument - sofern er vorher auf irgendeine Art und Weise aus diesem Dokument ermittelt wurde (Hier im Forum suchenXPath?). Wenn das alles zutrifft, dann brauchst du das Dokument nicht neu laden. Speichere es einfach, und die Datei sollte die neuen Eigenschaften enthalten.

tobu 22. Mär 2005 11:52

Re: Ersetzen einen Knotens
 
Ok, ich habe die Switch-Anweisung aus dem Code genommen. :roll:

Ich habe den Code jetzt wie foglt abgeändert:
Delphi-Quellcode:
procedure TForm1.KnotenErsetzen(Knoten: IXMLNode);
begin

  Knoten.Attributes['Nummer'] := ENummer.Text;

  Knoten.Attributes['Author'] := CBAuthor.Items[CBAuthor.ItemIndex];

  Knoten.ChildValues['Beschreibung'] := RBeschreibung.Text;
  Knoten.ChildValues['Befehl'] := RBefehl.Text;

  //Einrücken und speichern im XML-Document
  XMLDoc.Options := [doNodeAutoIndent];
  XMLDoc.SaveToFile(XMLDoc.FileName);

end;
Den Konten ermittele ich duch eine Suche
Delphi-Quellcode:
//Suchen des Knotens mit der gleichen Nummer
  for i := 0 to SQLDatei.Count-1 do
  begin
    knoten := SQLDatei.Nodes[i];
    if (IntToStr(knoten.Attributes['Nummer']) = ENummer.Text) then
    begin
       Result := i; //Gefundenen Knoten zurückgeben
       break;
    end
    else
      Result := -1;//Kein Knoten gefunden
  end;

 KnotenErsetzen(SQLDatei.Nodes[Result])
Leider wurde mein geänderter Konten nicht in das XML-Dokument geschrieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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