Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Probleme beim Löschen eines Nodes (https://www.delphipraxis.net/20488-probleme-beim-loeschen-eines-nodes.html)

Luckie 18. Apr 2004 22:43


Probleme beim Löschen eines Nodes
 
Ich komme irgendwie nicht weiter. Ich halte mich an das Tutorial von Chakotay.
Erstmal zum Aufbau der XML-Datei:
XML-Code:
  <?xml version="1.0" encoding="ISO-8859-1" ?>
- <adressdb>
- <XMLFile>
  <MajorVersion>1</MajorVersion>
  <MinorVersion>0</MinorVersion>
  <ModifyDate>2004-04-18</ModifyDate>
  <ModifyTime>23:37:43</ModifyTime>
  </XMLFile>
- <Kontakt>
  <ID>1</ID>
  <Name>Edit2</Name>
  <Vorname>Edit3</Vorname>
  </Kontakt>
- <Kontakt>
  <ID>2</ID>
  <Name>name</Name>
  <Vorname>vorname</Vorname>
  </Kontakt>
- <Kontakt>
  <ID>3</ID>
  <Name>Edit2</Name>
  <Vorname>Edit3</Vorname>
  </Kontakt>
  </adressdb>
Mein Code zum Löschen sieht so aus:
Delphi-Quellcode:
procedure TContactClass.DelContact(ID: Cardinal);
var
  Node: IXMLDOMNode;
  s: String;
begin
  s := '/adressdb/Kontakt[id="'+IntToStr(ID)+'"]';
  Node := FXMLDoc.documentElement.selectSingleNode(s);
  FXMLDoc.documentElement.removeChild(Node);
  // modify date and time of TXMLFile record
  EditXMLRecord;
  FXMLDoc.save(FFilename);
end;
Beim Ausführen ist Node allerdings nil und bei removeCild bekomme ich eine Exception mit der Meldung "falscher Parameter". Wo steckt da der Fehler?

MathiasSimmack 18. Apr 2004 22:57

Re: Probleme beim Löschen eines Nodes
 
Das Problem liegt in der Suchabfrage:
Zitat:

Delphi-Quellcode:
s := '/adressdb/Kontakt[id="'+IntToStr(ID)+'"]';

Du suchst nach einem Knoten <kontakt>, der eine bestimmte ID hat, und der sich in einem Knoten <adressdb> befindet. Allerdings suchst du vom root-Knoten aus:
Delphi-Quellcode:
Node := FXMLDoc.documentElement.selectSingleNode(s);
und das ist ja bereits der <adressdb>-Knoten. Entweder machst du also
Delphi-Quellcode:
Node := FXMLDoc.selectSingleNode(s);
oder du lässt "/adressdb/" in der XPath-Anfrage weg.

Und generell solltest du vor jedem Löschen/Bearbeiten/Hinzufügen auch prüfen, dass das Objekt nicht nil ist. Sonst kassiert du immer eine Exception, selbst wenn die Suchanfrage korrekt ist - wäre ja möglich, dass es den gesuchten Knoten nicht gibt.

MathiasSimmack 18. Apr 2004 23:05

Re: Probleme beim Löschen eines Nodes
 
Quatsch, Kommando zurück: XPath unterscheidet Groß- und Kleinschreibung:
Code:
s := '/adressdb/Kontakt[[color=#ff0000]id[/color]="'+IntToStr(ID)+'"]';
wirst du in deiner XML-Datei nicht finden.
Code:
<Kontakt>
  [color=#ff0000]<ID>1</ID>[/color]
  <Name>Edit2</Name>
  <Vorname>Edit3</Vorname>
</Kontakt>
Wo du die Suchabfrage startest (ob vom XML-Objekt selbst oder vom root-Knoten) ist unwichtig.
my fault :oops:

Luckie 18. Apr 2004 23:20

Re: Probleme beim Löschen eines Nodes
 
Perfekt. danke. Der Tipp mit dem Prüfen auf Nil ist gut. Kann man auch irgendwie feststellen, ob das Lsöchen geklappt hat?

MathiasSimmack 18. Apr 2004 23:31

Re: Probleme beim Löschen eines Nodes
 
Das PSDK meint, der Rückgabewert wäre das entfernte Objekt. (Schaust du mal rein unter "Data Services/MS XML 4 SDK"?). Aber die sicherste Möglichkeit wäre wohl, eine zweite Suchanfrage zu starten.


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