Delphi-PRAXiS

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

MathiasSimmack 11. Dez 2002 18:35

Falls du die Lösung nicht von allein findest, dann hänge doch einfach mal bitte deine XML-Datei ran. Dann kann man das mal mit der richtigen Datei testen. Ich weiß doch nicht, mit welchen Substrings du arbeitest ... und ein bisschen Latein wollte ich mir auch schon immer mal angucken ... :)

CalganX 11. Dez 2002 18:42

Liste der Anhänge anzeigen (Anzahl: 1)
Gut... Probleme finde ich nirgends...
Im Anhang eine/die (unformatierte) XML-Datei (nebenbei sind das ca. 90 Vokabeln).
Einfach von TXT nach XML umbennen...

Chris

MathiasSimmack 11. Dez 2002 19:20

Hi Chris.

Ich hab´s mir einfach gemacht und nur die lateinischen Begriffe alle in eine Listbox gelesen; einen davon ausgewählt (accusare), auf einen Button geklickt ... und fort war er ... Ich habe die Datei extra mit einem neuen Namen speichern lassen (zum Vergleichen). Von "anklagen" fehlte danach jede Spur.

Ich weiß jetzt auch keinen Rat mehr.
Was bleibt noch übrig?

Ein Fehler beim Kopieren des Substring vielleicht?
Wie gesagt, ich habe auf die Schnelle bloß die lateinischen Vokabeln in die Listbox schreiben lassen.

Mein Rat: deinen Anhang ändern und mal den Source deines Programms zippen.
(*hi hi* so bringt man Leute dazu, ihren Source rauszugeben ... :twisted:)


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