Entwickler-Ecke

Dateizugriff - Verändertes IHTMLDocument2 SaveToFile


LittleBen - So 23.03.14 15:59
Titel: Verändertes IHTMLDocument2 SaveToFile
Hallo,
ich lade ein Dokument aus dem Internet herunter, veränder es und möchte es zum schluss auf der Festplatte speichern (alles ohne TWebBrowser).

Delphi-Quelltext
1:
2:
3:
4:
Element1:= FDocument.createElement('div');
Element1.innerHTML:= AText;
{...}
(FDocument.Body as IHTMLDOMNode).appendChild(Element1 as IHTMLDOMNode);

Bisher habe ich das Speichern so probiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure SaveToFile(const ADoc: IHTMLDocument2; const AFileName: String);
var PersistFile: IPersistFile;
begin
 PersistFile:= ADoc as IPersistFile;
 PersistFile.Save(StringToOleStr(AFileName), System.True);
end;

Nur leider sieht das File dann genau so aus, wie ich es heruntergeladen habe. Also meine Änderungen wurden nicht übernommen :(
Weiß jemand, wie ich es schaffe, die Änderungen zu speichern?
Der Body ist genau so, wie ich es will (showmessage(FDocument.Body))

Viele Grüße
Littleben


Sinspin - Mo 24.03.14 15:57

Ich arbeite mit TWebBrowser zum anzeigen, nehme aber den gleichen Weg beim Speichern :

Delphi-Quelltext
1:
(WebBrowser.Document as IPersistFile).Save(PWideChar(DestPath+'DestName.html'), false);                    

Bei mir klappt es so, sobald der WebBrowser mal angezeigt wurde. Wenn ich ihn nicht anzeigen muss würde er mir eine leere Datei speichern.


LittleBen - Mo 24.03.14 16:30

Dann bearbeitest du das Dokument wahrscheinlich nicht.
Das Problem ist, dass ich dem Dokument noch etwas hinzufügen muss. Die Änderungen werde dann komischerweise nicht gespeichert, obwohl sie im Body richtig sind.


LittleBen - Mo 24.03.14 18:16

Okay, habe es nun geschafft, dass die Änderungen übernommen werden.
Es hat folgender Abschnitt gefehlt:

Delphi-Quelltext
1:
2:
3:
 FDocument.designMode := 'on';
while FDocument.readyState <> 'complete' do
 Application.ProcessMessages;


Jetzt habe ich aber das Problem, dass das gespeicherte File irgendeinen komischen Zeichensatz verwendet (nach jedem zeichen ein leerzeichen).
Was ist da los?


Sinspin - Mo 24.03.14 21:43

Das hört sich schwehr nach Multibyte Zeichensatz an. Schau mal in den Header der HTML, da müsste ja das Encoding stehen. Ist sicher nicht UTF8. Ich kann mich gerade nicht erinnern das ich da was einstellen musste um UTF8 zu bekommen. Wenn ich morgen früh dran denke schaue ich mal nach was das sein könnte. Ich habe hier das ganze Zeug nicht da.


Sinspin - Di 25.03.14 10:56

Setz mal das Charset explizit auf UTF8

Delphi-Quelltext
1:
FDocument.CharSet := 'utf-8'                    

Vieleicht wird es dann ja richtig gespeichert.
Und, ich verweise mal ganz dezent auf die M$ Hilfe zu dem Thema [http://msdn.microsoft.com/de-de/library/aa752574.aspx], falls du das noch nicht kennst ;-)