Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HowTo: XML-SingleNode löschen (https://www.delphipraxis.net/1568-howto-xml-singlenode-loeschen.html)

CalganX 9. Dez 2002 17:50


HowTo: XML-SingleNode löschen
 
Hi,
ich habe diese XML-Datei (Ausschnitt):
Code:
<obele>
 <test>
  <sub1>bla</sub1>
  <sub2>bla</sub2>
 </test>

 <test>
  <sub1>bla2</sub1>
  <sub2>bla2</sub2>
 </test>

</obele>
Nun will ich die erste test-Node mitsamt unterelement daraus haben? How to do? Arbeite mit IXMLDOMDocument2...

Chris

sakura 9. Dez 2002 18:30

Re: HowTo: XML-SingleNode löschen
 
Delphi-Quellcode:
var
  Node: IXMLDOMNode;
...
  // Node holen
  Node := xmlDoc.documentElement.selectSingleNode('test');
  // Node entfernen.
  Node.parentNode.removeNode(Node);

Zitat:

Zitat von Chakotay1308
Arbeite mit IXMLDOMDocument2...

Womit auch sonst.

CalganX 10. Dez 2002 12:38

Zitat:

Zitat von Delphi-Debugger
Undecleared Indentifier: removeNode

???

Chris

MathiasSimmack 10. Dez 2002 17:23

sakura meinte sicher
Code:
removeChild
Welche Delphi-Version hast du, Chris? Delphi 1? Es gibt so was wie die Vervollständigung von Code, Syntax, Klassen-Eigenschaften usw. Im Normalfall reicht es, z.B.
Code:
Node.
einzutippen und zu warten. Kurz darauf präsentiert dir Delphi die Möglichkeiten der Variable "IXMLDOMNode". Dann tippst du bloß auf R und E und solltest neben "replaceChild" auch auf besagtes "removeChild" stoßen.

CalganX 10. Dez 2002 18:56

Hi Matthias,
Zitat:

Wer lesen kann ist klar im Vorteil!
Und nebenbei: auf die Idee mit removeChild bin ich auch schon gekommen, nur tut sich da nix! Und die Syntax-Vervollständigung klappt auch nicht auf.
Hier mal, dass, was ich bei mir derzeit stehen habe:

Delphi-Quellcode:
  Vok := xmldoc.documentElement.selectNodes('/Vokabeln/vokabel[Latein="'+substr+'"]').item[0];
  Vok.parentNode.removeChild(Vok);
  UpdateVokList(Listbox2.Items);
Vok ist IXMLDOMNode...

Chris

MathiasSimmack 10. Dez 2002 20:10

Zitat:

Zitat von Chakotay1308
Wer lesen kann ist klar im Vorteil!

:wink:
Zitat:

Zitat von Delphi PRAXiS
Chakotay1308
Delphi 6 Enterprise

Meine Frage nach deiner Delphi-Version war ironischer Natur, da besagte Vervollständigungsfunktion standardmäßig aktiviert ist.


Wo der Fehler liegt, kann ich dir nicht sagen, da es für mich erst mal vernünftig aussieht. Auch wenn ich nicht verstehe, warum du jetzt das erste Element einer Node-Liste abfragst und nicht bei dem "singleNode" von sakura geblieben bist.
Abgesehen davon sollte dein Code funktionieren.

Wird der Knoten nicht gelöscht?
Wird die Datei nicht neu geschrieben?
Wird vielleicht die Listbox bloß nicht richtig aktualisiert?


M(it) f(estlichen) G(rüßen)
Mathias.

CalganX 11. Dez 2002 12:57

Hi Matthias,
der Knoten wird nicht gelöscht. An der Funktion bzgl. der Listbox kann nichts falsch sein, da sie bei einem anderen Button problemlos funktioniert...

Chris

CalganX 11. Dez 2002 14:57

Das Problem bei sakura's Code: da wird die erste herausgeholt, ggf. kann das auch eine andere sein (meinetwegen die 3.)...

Chris

MathiasSimmack 11. Dez 2002 17:44

Hi Chrisssssssssssssss! :wink:

Ich bin zwar nun auch kein XML-Genie, aber da du gezielt nach irgendeiner Vokabel suchst, kommst du mit "selectSingleNode" auf das selbe Ergebnis. Deine andere Behauptung (sorry, ich nenn´s mal so!) kann ich auch nicht nachvollziehen.

Ich habe mir mal deine oben gepostete XML-Beispieldatei genommen und gezielt den ersten "test"-Unterknoten entfernt:
Code:
node := xmldoc.selectSingleNode('obele/test[sub1="bla"]');
if(node <> nil) then
  node.parentNode.removeChild(node);

ShowMessage(xmldoc.xml);
Ging problemlos. Der Knoten war danach weg, und das war ja auch gewollt. Nun ist es nur ein Beispiel; aber ich sag´ mal so: der Code an sich ist schon in Ordnung. Vielleicht ist´s wieder nur ein Tippfehler irgendwo bei dir im Programm? :?

CalganX 11. Dez 2002 18:27

Hi Matthias, dann sieh dir mal bitte folgenden Source genauer an! Ich kann dir sagen, es wird der Knoten nicht gelöscht. Genauso wenig, wie dass ein Fehler angezeigt wird. Ich kann dir ggf. auch Screenshots geben! Ich kann dir schwören, dass das eigentlich funktionieren müsste! Denn ich glaube dir auch, dass das bei dir klappt.
Das Problem ist: Die Node existiert ja (Vok ist ja auch nicht nil)...

Delphi-Quellcode:
  substr := copy(ListBox2.Items[ListBox2.ItemIndex], 0, lastpos('-',ListBox2.Items[ListBox2.ItemIndex])-2); { Der string sollte eingentlich richtig sein (siehe n. Zeile) }
  ShowMessage(substr); { nur zur Überpfrüfung... }

  Vok := xmldoc.documentElement.selectSingleNode('/Vokabeln/vokabel[Latein="'+substr+'"]');
  if (Vok<>nil) then
    Vok.parentNode.removeChild(Vok)
  else
    MessageDlg('Schwerer Programmfehler: Löschen der Node war nicht '+#13+#10+'erfolgreich...', mtError, [mbOK], 0);
  UpdateVokList(Listbox2.Items);
Also, ich verstehe das jetzt nicht mehr... :wiejetzt: :wiejetzt: :wiejetzt:

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Seite 1 von 2  1 2      

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