Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Node von einem Dokument zum anderen kopieren (https://www.delphipraxis.net/74769-node-von-einem-dokument-zum-anderen-kopieren.html)

Sascha L 8. Aug 2006 14:43


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

marabu 8. Aug 2006 16:06

Re: Node von einem Dokument zum anderen kopieren
 
Hallo Sascha,

zeige bitte, wie du kopierst.

Grüße vom marabu

Sascha L 8. Aug 2006 16:24

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.

marabu 8. Aug 2006 19:38

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:
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;
marabu

Sascha L 8. Aug 2006 21:09

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:
{ 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;
Ich hab auch schon versucht, die Nodes direkt anzuhängen, ohne dass ich eine Variable "Node" verwende.

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

marabu 9. Aug 2006 21:13

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:

Zitat von Sascha L
Ich sollte noch erwähnen, dass ich OmniXML verwende, aber das ist ja nur eine Art "Weiterentwicklung" von MSXML

Das stufe ich mal als Folklore ein.

Grüße vom marabu


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