Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   XML-Node kopieren (https://www.delphipraxis.net/169717-xml-node-kopieren.html)

H.Bothur 7. Aug 2012 12:32

XML-Node kopieren
 
Moin,

vielleicht bin ich ja auch zu blöde, aber ...

mit dem folgenden Source will ich den einen kompletten Node in einen anderen in der gleichen XML-Datei kopieren - aber irgendwie geht das nicht. Sieht da jemand anderes den Fehler ?

ich hatte die Frage auch schon in Delphi-treff gestellt ... aber als Lösung kam da dann das ich das nur mit durchlaufen und kopieren der einzelnen SubNodes machen könnte ... aber leider schaffe ich selbst das nicht und weiß nicht weiter :(

Gruß
Hans

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject);
var
  movies: IXMLDOMNodeList; // wird alle Filme (die Pakete) enthalten
  newNode: IXMLDOMNode;
  oldNode: IXMLDOMNode; // enthält eine Node
  OldID: String;
begin
  (* Kopiert den Node 5 auf den Node 3 *)
  movies := xmlDoc.documentElement.selectNodes('movie');
  oldNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="3"]');
  OldID := Oldnode.selectSingleNode('id').text;
  newNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="5"]');
  oldNode := newNode;
  OldNode := movies.item[2].selectSingleNode('id');
  OldNode.Text := '3';
  UpdateList;
  end;

himitsu 7. Aug 2012 12:39

AW: XML-Node kopieren
 
Delphi-Quellcode:
oldNode := newNode;
kopiert nur Instanzzeiger, aber keine Objekt-/Interface-Inhalte. :zwinker:

Es gibt doch bestimmt in dem Node eine Methode welche sich irgendwie "Clone" nennt?

Delphi-Quellcode:
  OldNode := movies.item[2].selectSingleNode('id');
  OldNode.Text := '3';
Weglassen und nicht den Node, sondern nur dessen Subnodes klonen/rüberkopieren.

Delphi-Quellcode:
OldID := Oldnode.selectSingleNode('id').text;

ist irgendwie sinnlos, wobei dir der Compiler eigentlich sagen auch sollte, daß du den an OldID zugewiesenen Wert nirgends verwendest.

H.Bothur 7. Aug 2012 13:39

AW: XML-Node kopieren
 
Hi Himitsu,

Zitat:

Zitat von himitsu (Beitrag 1177207)
Delphi-Quellcode:
oldNode := newNode;
kopiert nur Instanzzeiger, aber keine Objekt-/Interface-Inhalte. :zwinker:

Das habe ich auch allmählich gelernt - da ich mich aber noch nie mit Pointer uä. beschäftigt habe ...

Zitat:

Es gibt doch bestimmt in dem Node eine Methode welche sich irgendwie "Clone" nennt?
Ja ... hier:

Delphi-Quellcode:
procedure TForm1.Button5Click(Sender: TObject); // kompletten Node in einen anderen kopieren
var
  movies: IXMLDOMNodeList; // wird alle Filme (die Pakete) enthalten
  newNode: IXMLDOMNode;
  oldNode: IXMLDOMNode; // enthält eine Node
begin
  (* Kopiert den Node 5 auf den Node 3 *)
  movies := xmlDoc.documentElement.selectNodes('movie');
  oldNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="3"]');
  newNode := OldNode.cloneNode(True);
  UpdateList;
end;
Aber ... da passiert eben nichts :(

Zitat:

Delphi-Quellcode:
OldID := Oldnode.selectSingleNode('id').text;
ist irgendwie sinnlos, wobei dir der Compiler eigentlich sagen auch sollte, daß du den an OldID zugewiesenen Wert nirgends verwendest.
Das ist ein rest von einem anderen Versuch, sorry :-)

Gruß
Hans

himitsu 7. Aug 2012 14:09

AW: XML-Node kopieren
 
Delphi-Quellcode:
// klont den Knoten "movie[id=3]" und speichert ihn in NewNode

//movies := xmlDoc.documentElement.selectNodes('movie'); // nicht verwendet
oldNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="3"]');
newNode := OldNode.cloneNode(True);

// mit NewNode wird nichts gemacht und es wird am Ende der Prozedur wieder weggeworfen
// ließ einfach mal, was in der OH zu cloneNode (Xmldom.IDOMNode.cloneNode) steht.
Aber du willst ja wohl irgendwas in dieser Richtung haben:
Delphi-Quellcode:
// kopiert Inhalt von 3 nach 5
oldNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="3"]');
newNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="5"]');
for i := 0 to newNode.childNodes.length - 1 do
  newNode.appendChild(oldNode.childNodes.item[i].cloneNode(True));

// oder

// kopiert die 3, benennt die Kopie in 5 um
oldNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer/movie[id="3"]');
newNode := xmlDoc.documentElement.selectSingleNode('/movieorganizer');
clone := oldNode.cloneNode(True);
clone.attributes.getNamedItem('id').text := '5';
newNode.appendChild(clone);


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