Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Datei bearbeiten und nur Teile wieder speichern (https://www.delphipraxis.net/109379-datei-bearbeiten-und-nur-teile-wieder-speichern.html)

Hoschie 2. Mär 2008 13:17

Re: Datei bearbeiten und nur Teile wieder speichern
 
Ich werde es gleich nachher mal ausprobieren.

Lob und Anerkennung für Deine Geduld und Deine Mühen(vor allem der Geduld :-D ).

Gruß
Hoschie

Hoschie 2. Mär 2008 14:45

Re: Datei bearbeiten und nur Teile wieder speichern
 
OK, es will nicht funktionieren.

Hier mal mein Quellcode :

Delphi-Quellcode:
// in der Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw_TLB, ActiveX, MSXML2_TLB;

// Prozedur mit Fehler
procedure TForm2.saveBody ();
var  // Variablendeklaration
fnNew: TFileName;
ws,s: WideString;
doc: OleVariant;
f, log: TextFile;
u, xdNew: IXMLDOMDocument;
xd: IXMLDOMNode;

// die Sachen hier vor habe ich aus Platzgründen rausgelassen, überwiegend Kommentar und auskommentiertes

    fnNew:=('c:\Scan.xml');
    u:=GetXMLDocument(WebBrowser1.Document);
    xd:=u.selectSingleNode('/root/data');
    xdNew.ComsDOMDocument.Create; // hier Fehlermeldung : [Fehler] Unit2.pas(125): E2003 Undefinierter Bezeichner: 'ComsDOMDocument'

    xdNew.documentElement:= xd.cloneNode(True) as IXMLDOMElement;
    xdNew.save(fnNew);
Ist wahrscheinlich etwas was euch ins Auge springt und bei mir abprallt.

marabu 2. Mär 2008 16:09

Re: Datei bearbeiten und nur Teile wieder speichern
 
Vergleiche mal:

Delphi-Quellcode:
xdNew := CoDomDocument.Create; // mein Code

xdNew.ComsDOMDocument.Create; // hier Fehlermeldung
Hast du dich da vertippt?

Hoschie 2. Mär 2008 16:52

Re: Datei bearbeiten und nur Teile wieder speichern
 
Äh Hi, :oops: :oops:

Zitat:

Ist wahrscheinlich etwas was euch ins Auge springt und bei mir abprallt.
:wall:
Entschuldige, von Blindheit geschlagen, aber ein Beweis fürs nicht einfach nur kopieren :roll: .

Darf ich noch Fragen, wie ich jetzt weitere Daten in der Datei anhänge, also in dieselbe Datei reinschreibe. So in der Art Append bei Stringbehandlung ?

Und dann sollte es das gewesen sein.

Vielen Dank. :thumb: :thumb:

marabu 2. Mär 2008 17:07

Re: Datei bearbeiten und nur Teile wieder speichern
 
Eine gut überlegte Frage beinhaltet meist schon die Lösung.

Deine Frage lässt viel offen, aber wenn ich unterstellen darf, dass du aus mehreren gleichartigen XML-Dokumenten die Lehrgänge extrahieren und in einem einzigen Dokument kumulieren möchtest, dann kennst du ja schon eine Lösung zum Extrahieren. Hinzufügen kannst du dann mittels einer Iteration über die einzelnen Lehrgänge und der Methode appendChild.

Magst du es selbst mal probieren?

Hoschie 2. Mär 2008 20:14

Re: Datei bearbeiten und nur Teile wieder speichern
 
Hi,

also ich habe das jetzt mal versucht umzusetzen und habe folgenden Code geschrieben

Delphi-Quellcode:
if FileExists (fnNew) then  // Prüfung ob File vorhanden
    begin
      xdNew.loadXML(fnNew); // File laden
      xdNew.appendChild(xd); // Neue daten anfügen
      xdNew.save(fnNew); // File wieder speichern
    end
    else
    begin
      xdNew.documentElement:= xd.cloneNode(True) as IXMLDOMElement; // Neues Eelemt in neuer File
      xdNew.save(fnNew); // File speichern
    end;
Das projekt kompiliert und läuft ohne Fehler durch, allerdings wird immer nur das letzte Element in der Datei gespeichert, egal ob sie neu erstellt oder geladen wurde.

Kann es sein dass
Delphi-Quellcode:
 xdNew.appendChild(xd);
nicht ganz stimmt?
Habe es auch schon mit
Delphi-Quellcode:
xdNew.documentElement.appendChild(xd);
versucht, dass gab aber eine Zugriffsverletzung.

Gruß
Hoschie

marabu 2. Mär 2008 20:27

Re: Datei bearbeiten und nur Teile wieder speichern
 
xdNew.appendChild(xd) ist ganz sicher falsch.

Du willst die childNodes von xd.documentElement hinter den childNodes von xdNew.documentElement einfügen - und zwar in einer Schleife.

Mach mal, während ich ein Bad nehme.

Hoschie 2. Mär 2008 20:49

Re: Datei bearbeiten und nur Teile wieder speichern
 
Hmmm,

aber ich habe in der Variablen xd
Delphi-Quellcode:
xd:=u.selectSingleNode('/root/data/Lehrgang');
schon das Element Lehrgang drin (oder?). Das will ich jetzt nur noch anhängen. Die Zieldatei sieht im Moment so aus
Delphi-Quellcode:
<root>
  <data>
    <Lehrgang></Lehrgang> // hier sollen die anderen angehängt werden.
  </data>
</root>
Aber jetzt bade mal in Ruhe, dass hast du dir verdient :mrgreen: :thumb:
Für mich ist wohl jetzt auch erstmal Feierabend, meine Frau schaut schon so merkwürdig.

Gruß
Hoschie

Hoschie 3. Mär 2008 20:20

Re: Datei bearbeiten und nur Teile wieder speichern
 
Moin Moin,

ich habs rausgefunden. Und geholfen hat mir dabei zusätzlich zu marabus sehr guten Anregungen ein wiederholtes, intensives Lesen, des XML-Tutorials.

Mein Code:
Delphi-Quellcode:
try
    fnNew:=('c:\Scan.xml'); // Datei zum speichern
    u:=GetXMLDocument(WebBrowser1.Document); // XML Quelle
    xd:=u.selectSingleNode('/root/data/Lehrgang'); // Benötigtes Element
    xdNode:=xd.cloneNode(True) as IXMLDOMElement;; // wichtig !!
    xdNew:= ComsDOMDocument.Create;

    if not FileExists (fnNew) then // erstellen File
    begin
      xdNew.loadXML('<?xml version="1.0"?><root></root>');
      xdNew.documentElement.appendChild(xdNode); // hier hakte es
      xdNew.save(fnNew);
    end
    else
    begin
      xdNew.load(fnNew);
      xdNew.documentElement.appendChild(xdNode); // an bestehende Datei anhängen
      xdNew.save(fnNew);
    end;
  except
  if FileExists('C:\Log.txt') then / LogFile zur Sicherheit
    begin
    AssignFile(log, 'C:\Log.txt');
    Append(log);
    Write(log,(Edit1.Text+chr(13)+chr(10)));
    CloseFile(log);
    end
  else
    begin
    AssignFile(log, 'C:\Log.txt');
    ReWrite(log);
    Write(log,(Edit1.Text+chr(13)+chr(10)));
    CloseFile(log);
    end;
  end;
Damit läuft es schon mal so, wie es soll. Jetzt werde ich da mal ein paar Testläufe mit machen um zu sehen wie es mit der Speicherverwaltung ist. Ich weiss noch nicht so recht, ob ich nicht noch irgendwas wieder freigeben muss.

Gruß
Hoschie

marabu 4. Mär 2008 18:50

Re: Datei bearbeiten und nur Teile wieder speichern
 
Hallo Hoschie,

Glückwunsch zur deiner eigenen Leistung. Steckt da in jedem Dokument immer nur ein Lehrgang?

Hier noch ein paar versteckte Anregungen:

Delphi-Quellcode:
const
  FN_LOG = 'log.txt';
  XML_TEMPLATE = '<?xml version="1.0"?><root></root>';

procedure WriteLog(const msg: string);
var
  log: TextFile;
begin
  AssignFile(log, FN_LOG);
  if FileExists(FN_LOG)
    then Append(log)
    else Rewrite(log);
  WriteLn(log, DateTimeToStr(Now), #9, msg);
  CloseFile(log);
end;

function LoadXml(xd: IXMLDOMDocument; const fn: TFileName): Boolean;
begin
  if FileExists(fn)
    then Result := xd.load(fn)
    else Result := xd.loadXML(XML_TEMPLATE);
end;


// ...
begin
  // ...
  if LoadXml(xdNew, fnNew) then
  begin
    xdNew.documentElement.appendChild(xdNode);
    xdNew.save(fnNew);
  end else Log(Edit1.Text);
  // ...
end;
Getippt und nicht getestet.

Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.
Seite 3 von 6     123 45     Letzte »    

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