![]() |
Node von einem Dokument zum anderen kopieren
Hi,
habe zwei IXMLDocuments. Nun möchte ich einen IXMLNode vom einen zum anderen kopieren, das Problem ist nur, dass ich ständig folgende Fehlermeldung bekomme: "NewChild was created from a different document than the one that created this node". Gruß Sascha |
Re: Node von einem Dokument zum anderen kopieren
Hallo Sascha,
zeige bitte, wie du kopierst. Grüße vom marabu |
Re: Node von einem Dokument zum anderen kopieren
Habs einmal mit AppendChild und einmal mit Add bzw. AddNode ausprobiert.
Also mit kopieren meinte ich jetzt nichts besonderes, sondern einfach bei beiden Documents die Nodes selektieren und den einen Node an den anderen hängen, was ja intern in nur einem Document ohne Probleme geht. Die Fehlermeldung, die ich erhalte, ist ja eine allgemeine, weil es - aus welchen Gründen auch immer- nicht erlaubt ist einen Node von einem Document an einen Node von einem anderen Document anzuhängen. D.h. ich brauche nun eine Kopierfunktion, mit der es doch geht. |
Re: Node von einem Dokument zum anderen kopieren
Schade, dass du deinen Code nicht zeigen kannst. Ich hatte gefragt, weil ich da kein Problem kenne:
Delphi-Quellcode:
marabu
uses
MSXML2; procedure TMainForm.ButtonClick(Sender: TObject); var inDoc: IXMLDOMDocument2; outDoc: IXMLDOMDocument2; nIn, nOut: IXMLDOMNode; msg: String; begin inDoc := CoDomDocument.Create; inDoc.async := False; outDoc := CoDomDocument.Create; outDoc.async := False; with inDoc do begin documentElement := CreateElement('inroot'); nIn := documentElement.appendChild(CreateElement('intest')); end; with outDoc do begin documentElement := CreateElement('outroot'); nOut := documentElement.appendChild(CreateElement('outtest')); nOut.appendChild(nIn.cloneNode(False)); if Assigned(inDoc.documentElement) then msg := inDoc.xml else msg := 'n/a'; ShowMessage('after node copy:'#13#10 + 'inDoc.xml:'#13#10 + msg + #13#10 + 'outDoc.xml:'#13#10 + outDoc.documentElement.xml ); end; with outDoc do begin documentElement := inDoc.documentElement; if Assigned(inDoc.documentElement) then msg := inDoc.xml else msg := 'n/a'; ShowMessage('after node transfer:'#13#10 + 'inDoc.xml:'#13#10 + msg + #13#10 + 'outDoc.xml:'#13#10 + outDoc.documentElement.xml ); end; end; |
Re: Node von einem Dokument zum anderen kopieren
Klar, kann ich den Code zeigen ;) Halte ihn nur für trivial...
Ich sollte noch erwähnen, dass ich OmniXML verwende, aber das ist ja nur eine Art "Weiterentwicklung" von MSXML.
Delphi-Quellcode:
Ich hab auch schon versucht, die Nodes direkt anzuhängen, ohne dass ich eine Variable "Node" verwende.
{ Import-Liste laden }
XMLImport := CreateXMLDoc; XMLImport.Load(ImportFile); NodeList := XMLImport.SelectNodes(ExportNode); { Alle gefundenen Nodes ins Template kopieren } for i := 0 to NodeList.Length - 1 do begin XMLTemplate := CreateXMLDoc; XMLTemplate.Load(Template); Node := NodeList.Item[i]; Node2 := XMLTemplate.SelectSingleNode(AggNode); if Node2 <> nil then Node2.AppendChild(Node); // Hier kommt die oben genannte Fehlermeldung end; Der Code ist natürlich noch nicht fertig und ergäbe so auch keinen Sinn. Am Ende soll für jedes Mal eine neue Datei gespeichert werden. Gruß Sascha P.S.: Wenn ich deinen Code kopiere und es mit OmniXML mache, dann bekomme ich auch dieselbe Fehlermeldung. P.P.S.: Hab nun einfach in der OmniXML-Unit die entsprechende Stelle auskommentiert, die verhindert, dass man einen Node zum anderen kopieren kann :D |
Re: Node von einem Dokument zum anderen kopieren
Hallo Sascha,
OmniXML hat einige Defizite. Unter anderem wird seit Jahren an der Methode CloneNode gebastelt, aber ohne durchschlagenden Erfolg. Tatsache ist, dass auch in der aktuellen Version das einfache Übertragen von Knoten zwischen verschiedenen Dokumenten nicht möglich ist. Zitat:
Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz