Einzelnen Beitrag anzeigen

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