![]() |
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 |
Re: Datei bearbeiten und nur Teile wieder speichern
OK, es will nicht funktionieren.
Hier mal mein Quellcode :
Delphi-Quellcode:
Ist wahrscheinlich etwas was euch ins Auge springt und bei mir abprallt.
// 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); |
Re: Datei bearbeiten und nur Teile wieder speichern
Vergleiche mal:
Delphi-Quellcode:
Hast du dich da vertippt?
xdNew := CoDomDocument.Create; // mein Code
xdNew.ComsDOMDocument.Create; // hier Fehlermeldung |
Re: Datei bearbeiten und nur Teile wieder speichern
Äh Hi, :oops: :oops:
Zitat:
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: |
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? |
Re: Datei bearbeiten und nur Teile wieder speichern
Hi,
also ich habe das jetzt mal versucht umzusetzen und habe folgenden Code geschrieben
Delphi-Quellcode:
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.
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; Kann es sein dass
Delphi-Quellcode:
nicht ganz stimmt?
xdNew.appendChild(xd);
Habe es auch schon mit
Delphi-Quellcode:
versucht, dass gab aber eine Zugriffsverletzung.
xdNew.documentElement.appendChild(xd);
Gruß Hoschie |
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. |
Re: Datei bearbeiten und nur Teile wieder speichern
Hmmm,
aber ich habe in der Variablen xd
Delphi-Quellcode:
schon das Element Lehrgang drin (oder?). Das will ich jetzt nur noch anhängen. Die Zieldatei sieht im Moment so aus
xd:=u.selectSingleNode('/root/data/Lehrgang');
Delphi-Quellcode:
Aber jetzt bade mal in Ruhe, dass hast du dir verdient :mrgreen: :thumb:
<root>
<data> <Lehrgang></Lehrgang> // hier sollen die anderen angehängt werden. </data> </root> Für mich ist wohl jetzt auch erstmal Feierabend, meine Frau schaut schon so merkwürdig. Gruß Hoschie |
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:
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.
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; Gruß Hoschie |
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:
Getippt und nicht getestet.
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; Freundliche Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 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