![]() |
XML-Node von einem XML-Document in ein anderes verschieben
Hallo,
Ich habe hier ein IXMLDocument A mit einigen Nodes A.Nodes[]. Nun will ich einen Knoten in ein zweites IXMLDocument B verschieben, das die gleiche Datenstruktur beinhaltet, schematechnisch also kein Problem. Nur, wie geht das? Ich bräuchte sowas wie:
Delphi-Quellcode:
Sei A eine Liste von Nodes [N0,N1,N2] und B eine Liste [M0,M1]. Dann soll der Aufruf TransferNode (A,B,2) Folgendes liefern: A=[N0,N1] und B=[M0,M1,N2].
Procedure TransferNode (aSrcDoc, aDestDoc : IXMLDocument; aNodeIndex : Integer);
Begin ... End; Das kann doch nicht so schwer sein. Natürlich könnte ich umständlich einen leeren Knoten in B erzeugen und dann einzeln (und rekursiv) alle Attribute und Unterknoten kopieren, und dann anschliessend den Knoten löschen, aber das ist doch krank. Kann mir da Einer helfen? Danke |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Hi alzaimar,
hast du MS Office 2003 installiert? Dann hast du MSXML5 und kannst (endlich) mit importNode() arbeiten - Methode von IXMLDOMDocument3. Wenn du nur MSXML4 hast, dann musst du mit IXMLDOMDocumentFragment arbeiten. Code kann ich dir erst morgen geben. Grüße vom marabu |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Hi marabu!
Danke für die Antwort: Beim Kunden steht bestimmt kein OFS 2003 rum... IXMLDOMDocumentFragment? Ich schau mal nach. Danke für die Mühe. Ach, und Code wäre nett. Kann ja sein, das die Senilität wieder zuschlägt! Bis denne Als Eimer |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Was du heute kannst besorgen...
Ohne MSXML5:
Delphi-Quellcode:
[edit] Oder einfach:
procedure TransferNode(nParentSrc, nParentDst: IXMLDOMNode; index: integer);
var n: IXMLDOMNode; begin n := nParentSrc.childNodes.item[index]; nParentDst.appendChild(nParentSrc.removeChild(n)); end;
Delphi-Quellcode:
Das geht zur Not schon ohne procedure...[/edit]
procedure TransferNode(nParentSrc, nParentDst: IXMLDOMNode; index: integer);
begin nParentDst.appendChild(nParentSrc.childNodes.item[index]); end; marabu |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Ist die Installation von Office 2003 eigentlich die einzige Möglichkeit um an MSXML5 zu kommen?
|
Re: XML-Node von einem XML-Document in ein anderes verschieb
Hi Günter,
im Prinzip: JA. Grüße vom marabu |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Das ist schade, denn MSXML4 hat man ja auch so bekommen ohne office.
|
Re: XML-Node von einem XML-Document in ein anderes verschieb
Leider klappt das bei mir irgendwie nicht, weil ich den Typen IXMLDOMNode nicht finde, sondern nur IDOMNode. Damit passier aber - gar nix!
Ich musste mir so behelfen
Delphi-Quellcode:
Das ist zwar ein Overhead, weil der Knoten erst dupliziert wird, aber als Notlösung immer noch besser als rekursives Kopieren. So langsam hab ich kein' Bock mehr, mit MSXML zu arbeiten. Mein Mitstreiter verwendet Java und schmunzelt immer über meine Wutanfälle...
Function MoveNode (aSrc, aDest : IXMLNodeCollection; aIndex : Integer) : IXMLNode;
Var n : IXMLNode; i : Integer; Begin n := aSrc.Nodes [aIndex]; i := adest.ChildNodes.Add (n.CloneNode(True)); aSrc.Remove(n); Result := aDest.Nodes [i]; End; |
Re: XML-Node von einem XML-Document in ein anderes verschieb
Hi alzaimar,
für nächstes Mal: mach ein Konsolfenster auf, geh in deinen Delphi Imports Ordner und starte TLIBIMP:
Code:
Dann kannst du die unit MSXML2.PAS als Komponente installieren. Wenn du die unit MSXML2 in deinen Programmen einbindest, dann stehen dir alle Interfaces zur Verfügung - und deinem Kollegen vergeht das Lachen.
tlibimp -Fe- %windir%\system32\msxml4.dll
[edit] Eventuell hätte - ohne die Unit MSXML2 - auch das hier funktioniert:
Delphi-Quellcode:
[/edit]
procedure TransferNode(nSrc, nDst: IXMLNode; index: integer);
begin nDst.DOMNode.appendChild(nSrc.DOMNode.childNodes.item[index]); end; Grüße vom marabu |
AW: XML-Node von einem XML-Document in ein anderes verschieben
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
und die IXMLNodeCollection-Geschichte funktioniert hier nicht, weil (iXMLNode-Instanz).Collection nil ist oO ps. ich brauchte einen Export von payload, den ich zwar mit den restlichen Daten importiere, jedoch nicht direkt verwende, aber wieder speichern muss. Damit ich keine TXMLDocument-Instanzen herumschleppen muss, habe ich das Beiwerk als String abgelegt. So bekommt man die mit .XML ausgegebenen strings wieder importiert:
Delphi-Quellcode:
procedure StringToXMLNodes(parent: iXMLNode; str: String);
var dummydoc : TXMLDocument; dummysource : TStringStream; buffer : String; primary : iXMLNode; OneNode : iXMLNode; idx : integer; begin if str = '' then exit; // wrap content into dummy document buffer := '<?xml version="1.0"?>'#13#10'<sheet>'+str+'</sheet>'; dummysource := TStringStream.Create(buffer); dummysource.Seek(0,soFromBeginning); // use import functionality from this instance dummydoc := TXMLDocument.Create(Application); dummydoc.LoadFromStream(dummysource); // feed the instance dummydoc.Active := True; // and activate it primary := dummydoc.Node.ChildNodes[1]; // just [1]: <sheet>...</sheet> if assigned(primary) then begin // clone nodes, insert for idx := 0 to primary.ChildNodes.Count -1 do begin OneNode := primary.ChildNodes[idx].CloneNode(true); parent.ChildNodes.Insert(-1,OneNode); end; end; // clean up dummydoc.Active := False; dummydoc.Destroy; // not sure if this is valid (what does Active=False do?) dummysource.Destroy; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 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