Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XML Eintrag löschen (https://www.delphipraxis.net/8362-xml-eintrag-loeschen.html)

Akut-Programming 3. Sep 2003 10:07


XML Eintrag löschen
 
Hi! :lol:

Ist es möglich eine subNode komplett zu löschen. Also wenn ich z.B. alle gespeicherten Daten zu einem Film, der einer FilmID zugeordnet ist, löschen will, dann will ich ja alle Infos z.B. von FilmID "1" gelöscht haben.

MathiasSimmack 3. Sep 2003 10:10

Re: XML Eintrag löschen
 
Ja, das geht. Falls du Code willst, musst du uns aber mal ein bisschen von deiner XML-Struktur zeigen. So ganz ohne Vorlage wird´s schwer. :wink:

Sanchez 3. Sep 2003 10:11

Re: XML Eintrag löschen
 
hallo,

so z.B.

Delphi-Quellcode:
  node :=xmlDoc.selectSingleNode('/werte/eintrag[id="'+itoa(id,0)+'"]');
  parentnode := node.parentNode;
  parentnode.removeChild(node);
grüße, daniel

Akut-Programming 3. Sep 2003 13:00

Re: XML Eintrag löschen
 
Also Mathias, hier is n Stücke aus meiner XML
Code:
<PlanView>
<termin>
  <terminid>1</terminid>
  <terminbez>TestTermin1</terminbez>
  <datum>03.09.2003</datum>
  <uhrzeit>12:00</uhrzeit>
  <bemerkung>versuchmers ma!</bemerkung>
</termin>
<termin>
  <terminid>2</terminid>
  <terminbez>TestTermin2</terminbez>
  <datum>03.09.2003</datum>
  <uhrzeit>12:00</uhrzeit>
  <bemerkung>versuchmers nochma!</bemerkung>
  </termin>
</PlanView>
Reicht dir das? :roll:

Akut-Programming 3. Sep 2003 13:05

Re: XML Eintrag löschen
 
Zitat:

Zitat von Sanchez0815
hallo,
so z.B.
Delphi-Quellcode:
node :=xmlDoc.selectSingleNode('/werte/eintrag[id="'+itoa(id,0)+'"]');
  parentnode := node.parentNode;
  parentnode.removeChild(node);
grüße, daniel

So hab ichs versucht, muss ich noch ne uses eintragen oder so, weil er bei mir meint itoa(id,0) ist kein definierter Bezeichner. Ebenfalls parentnode.

Sorry für die vielleicht dummen fragen. Hab nur grad erst mit XML angefangen.

Sanchez 3. Sep 2003 13:14

Re: XML Eintrag löschen
 
Sorry itoa musst durch StrToInt ersetzen.
Parentnode musst du definieren - gleich wie node

Delphi-Quellcode:
var parentnode, node: IXMLDOMNode;
grüße, daniel

Akut-Programming 3. Sep 2003 13:44

Re: XML Eintrag löschen
 
Und "id" in StrToInt wäre dann sozusagen bei mir die terminid, oder??! Da bei mir die Meldung kommt, das id n undefinierter Bezeichner ist. :oops:

Sanchez 3. Sep 2003 14:13

Re: XML Eintrag löschen
 
Genau

Akut-Programming 3. Sep 2003 14:22

Re: XML Eintrag löschen
 
Also im Moment würde es so bei mir aussehen. Um XML Einträge zu löschen, habe ich ein Bild eingefügt, welches dann mit einem OnCLick Ereignis belegt ist...

Delphi-Quellcode:
procedure Tfrm_planview_main.Image2Click(Sender: TObject);
var
  node, parentnode: IXMLDOMNode;
  id: integer;
begin
  id:=StrToInt(xmlDoc.selectSingleNode('/PlanView/termin/terminid').text);
  node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
  parentnode := node.parentNode;
  parentnode.removeChild(node);
end;
Im Programm selber bekomme ich keine Fehlermeldung, aber das löschen klappt trotzdem nicht :cry:

Sanchez 3. Sep 2003 14:28

Re: XML Eintrag löschen
 
Du musst nach dem löschen noch

Delphi-Quellcode:
xmlDoc.save(filename);
machen, damit du es in der Datei übernimmst

PS: Gegebenenfalls musst du noch deine Anzeige updaten um die Änderung in deinem Prog sehen zu können

Akut-Programming 3. Sep 2003 14:44

Re: XML Eintrag löschen
 
Ach man :evil: es geht immer noch nich. Mit diesem Code...
Delphi-Quellcode:
procedure Tfrm_planview_main.Image2Click(Sender: TObject);
var
  node, parentnode: IXMLDOMNode;
  id: integer;
begin
  id:=lv_eintraege.Selected.Index;
  node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
  parentnode := node.parentNode;
  parentnode.removeChild(node);
  xmlDoc.save(frm_planview_main.instpath + xmlfilename);
  frm_planview_main.UpdateList;
  frm_planview_main.lv_eintraege.AlphaSort;
end;
...bekomme ich ne Zugriffsverletzung. :?: :?: :?: Muss ich das verstehen?

Sanchez 3. Sep 2003 14:55

Re: XML Eintrag löschen
 
Delphi-Quellcode:
procedure Tfrm_planview_main.Image2Click(Sender: TObject);
var
  node, parentnode: IXMLDOMNode;
  id: integer;
begin
  id:=lv_eintraege.Selected.Index;
  node :=xmlDoc.selectSingleNode('/PlanView/termin[terminid="'+IntToStr(id)+'"]');
 
  if node <> nil then begin
    parentnode := node.parentNode;
    parentnode.removeChild(node);
    xmlDoc.save(frm_planview_main.instpath + xmlfilename);
    frm_planview_main.UpdateList;
    frm_planview_main.lv_eintraege.AlphaSort;
  end;
end;
Ich denke mal, du hast keinen Node mit dieser id drinne. Besser schaust vorher ob node <> nil ist. Die Zufgriffsverletzung sollte zumindest weg sein.

Akut-Programming 3. Sep 2003 15:12

Re: XML Eintrag löschen
 
Ja, jetzt hab ich zwar keine Zugriffsverletzung mehr, aber den letzten Eintrag der XML Datei kann er nicht löschen. Ich vermute er bekommt irgendwie die falsche ID oder so!?

MathiasSimmack 3. Sep 2003 15:20

Re: XML Eintrag löschen
 
Ich würde auch vorher prüfen, ob der Knoten ungleich nil.
Aber hast du auch daran gedacht, dass Indexwerte wie
Zitat:

Zitat von Akut-Programming
Delphi-Quellcode:
id:=lv_eintraege.Selected.Index;

meist null-basierend sind, dein Index in der XML-Datei aber wahrscheinlich bei Eins beginnt?

Akut-Programming 3. Sep 2003 15:25

Re: XML Eintrag löschen
 
@Mathias: ich habe weiter oben einen Auszug meiner XML Datei, könntest du dir das mal angucken. Und mir dann ma vielleicht beim Source helfen!?

MathiasSimmack 3. Sep 2003 15:50

Re: XML Eintrag löschen
 
Brauche ich nicht. Der Beispielcode, den Sanchez zuletzt gepostet hat, ist funktionsfähig. Zumindest klappte das bei mir in den Grundzügen: ich habe deinen XML-Code aus dem Browser kopiert und über einen Button-Klick den ersten Knoten entfernen lassen.
(Das spezielle, was sich auf die List-View bezieht, habe ich weggelassen.)

´s ging.

Was mir noch einfällt, wäre, dass eben nicht der erwartete Index zurückgeliefert wird. Möglicherweise durch deine Sortierung der List-View. Vielleicht solltest du besser den Termineintrag überprüfen? Oder auf die Sortierung verzichten.

Akut-Programming 3. Sep 2003 18:53

Re: XML Eintrag löschen
 
:bounce1: Alles klar, jetzt funzt´s auch bei mir. Es lag an der Sortierung! THX für die Hilfe!!! :dancer:

:dp:


Gruß,

Akut-Programming 4. Sep 2003 07:38

Re: XML Eintrag löschen [gelöst]
 
:roll: Hmm so ganz scheints doch nich gelöst zu sein. Ich wollt jetzt grad ma meinen Eintrag bearbeiten und bekomme ne Zugriffsverletzung.

Delphi-Quellcode:
procedure Tfrm_edit.bn_speichernClick(Sender: TObject);
var
  id: string;
  node: IXMLDOMNode;
begin
  id := IntToStr(frm_terminplaner_main.lv_eintraege.SelCount);
  xmlDoc := frm_terminplaner_main.xmlDoc;
  node := xmlDoc.documentElement.selectSingleNode('/PlanView/termin[terminid="'+id+'"]');
  node.selectSingleNode('terminbez').text:=ed_terminbez.Text;// Hier bekomme ich die Zugriffsverletzung angezeigt
  node.selectSingleNode('datum').text:=DateToStr(cb_von_datum.Date);
  node.selectSingleNode('uhrzeit').text:=ed_von_uhrzeit.Text;
  node.selectSingleNode('bemerkung').text:=ed_bemerkung.Text;

  xmlDoc.save(frm_terminplaner_main.instpath + xmlfilename);
  frm_terminplaner_main.xmlDoc:=xmlDoc;
  frm_terminplaner_main.UpdateList;
end;
Kann mir da jemand helfen? :oops:

Sanchez 4. Sep 2003 07:48

Re: XML Eintrag löschen
 
hallo,

Ich würde auf alle Fälle (wie schon vorher mal beschrieben) auf node <> nil überprüfen bevor du drauf zugreifts.

Ich schätze mal das wieder deine ID nicht in der File vorkommt.
Diese Zeile
Delphi-Quellcode:
  id := IntToStr(frm_terminplaner_main.lv_eintraege.SelCount);
Schätze ich ohne das Programm zu sehen als Fehler ein.
Am besten du setzt deine ID irgendwo ein dein Listview dazu rein (oder sonst wohin) und holst sie dir dann von dort raus.

grüße, daniel

MathiasSimmack 4. Sep 2003 09:03

Re: XML Eintrag löschen [gelöst]
 
Hm,
Zitat:

Zitat von Akut-Programming
Delphi-Quellcode:
id := IntToStr(frm_terminplaner_main.lv_eintraege.SelCount);

"SelCount" ist doch die Anzahl der markierten Einträge, oder? Wenn du den dritten Eintrag von unten markierst, lautet das Ergebnis: Eins. Markierst du den ersten Eintrag, lautet das Ergebnis: Eins. Markierst du den ersten und den letzten Eintrag, lautet das Ergebnis: Zwei.

@Akut-Programming: Etwas mehr Sorgfalt bitte, und berücksichtige bitte den Tipp von Sanchez: Den Knoten auf <> NIL prüfen, bevor du darauf zugreifst! :roll:

Akut-Programming 4. Sep 2003 09:11

Re: XML Eintrag löschen
 
Ja danke nochma, die Prozedur des ButtonClicks war noch nich mit dem aus dem Hauptform abgegelichen. Jetzt funzt´s widder. THX!!


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