AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi XML-Node von einem XML-Document in ein anderes verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

XML-Node von einem XML-Document in ein anderes verschieben

Ein Thema von alzaimar · begonnen am 21. Sep 2005 · letzter Beitrag vom 31. Mai 2011
Antwort Antwort
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

XML-Node von einem XML-Document in ein anderes verschieben

  Alt 21. Sep 2005, 19:20
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:
Procedure TransferNode (aSrcDoc, aDestDoc : IXMLDocument; aNodeIndex : Integer);
Begin
  ...
End;
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].

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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 21. Sep 2005, 20:52
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 21. Sep 2005, 20:59
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
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 21. Sep 2005, 21:15
Was du heute kannst besorgen...

Ohne MSXML5:

Delphi-Quellcode:
procedure TransferNode(nParentSrc, nParentDst: IXMLDOMNode; index: integer);
var
  n: IXMLDOMNode;
begin
  n := nParentSrc.childNodes.item[index];
  nParentDst.appendChild(nParentSrc.removeChild(n));
end;
[edit] Oder einfach:

Delphi-Quellcode:
procedure TransferNode(nParentSrc, nParentDst: IXMLDOMNode; index: integer);
begin
  nParentDst.appendChild(nParentSrc.childNodes.item[index]);
end;
Das geht zur Not schon ohne procedure...[/edit]

marabu
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 21. Sep 2005, 21:57
Ist die Installation von Office 2003 eigentlich die einzige Möglichkeit um an MSXML5 zu kommen?
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 22. Sep 2005, 06:03
Hi Günter,

im Prinzip: JA.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 22. Sep 2005, 08:09
Das ist schade, denn MSXML4 hat man ja auch so bekommen ohne office.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 22. Sep 2005, 09:29
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:
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;
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...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: XML-Node von einem XML-Document in ein anderes verschieb

  Alt 22. Sep 2005, 09:46
Hi alzaimar,

für nächstes Mal: mach ein Konsolfenster auf, geh in deinen Delphi Imports Ordner und starte TLIBIMP:

Code:
tlibimp -Fe- %windir%\system32\msxml4.dll
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.

[edit]
Eventuell hätte - ohne die Unit MSXML2 - auch das hier funktioniert:

Delphi-Quellcode:
procedure TransferNode(nSrc, nDst: IXMLNode; index: integer);
begin
  nDst.DOMNode.appendChild(nSrc.DOMNode.childNodes.item[index]);
end;
[/edit]

Grüße vom marabu
  Mit Zitat antworten Zitat
hboy

Registriert seit: 16. Jan 2004
364 Beiträge
 
#10

AW: XML-Node von einem XML-Document in ein anderes verschieben

  Alt 31. Mai 2011, 22:16
Zitat:
Eventuell hätte - ohne die Unit MSXML2 - auch das hier funktioniert:
siehe Anhang.


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;
Miniaturansicht angehängter Grafiken
nodes.png  
Power is nothing without TControl

Geändert von hboy (31. Mai 2011 um 23:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 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