XML: #4 (usw.) abspeichern
Hi,
ich möchte einen Wert abspeichern, der zuvor per Rijndael verschlüsselt wurde. Das Problem ist, dass in dem Wert nun Zeichen wie #4, #2 sind. Mein XML-Dokument ist UTF8 kodiert. Folgende Variante versuche ich zum abspeichern:
Delphi-Quellcode:
Bei [1] kommt eine Exception:
with TCipher_Rijndael.Create(PW, nil) do
begin tmp := EncodeString(Profil.Passwort); Free; end; tmp := UTF8Encode(tmp); SetNodeText(Node, 'password', tmp); // [1]
Code:
Tja, hat wer eine Lösung parat? ;)
---------------------------
Project1 --------------------------- An invalid character was found in text content. --------------------------- OK --------------------------- |
Re: XML: #4 (usw.) abspeichern
Hallo Manuel,
wie kommst du darauf, dass dein Dokument UTF-8 kodiert sei - du hast es doch noch gar nicht gespeichert. Du hätttest vielleicht noch schreiben sollen, mit welchen Komponenten bzw. Schnittstellen du arbeitest. MSXML DOM arbeitet intern mit UTF-16. Nur beim Laden und Speichern wird das encoding aus der XML-Deklaration berücksichtigt. Grüße vom marabu |
Re: XML: #4 (usw.) abspeichern
Hi marabu,
am Besten zeig ich dir mal meine ganze Routine:
Delphi-Quellcode:
Ich arbeite mit MSXML^^
procedure TProfile.Save;
procedure DoSave(Doc: IXMLDocument); var I: Integer; Node: IXMLNode; Profil: TProfil; tmp: String; begin Node := Doc.DocumentElement.AddChild('count'); SetNodeInt(Node, 'count', Count); for I := 0 to Count - 1 do begin Profil := Items[I]; Node := Doc.DocumentElement.AddChild('profile' + IntToStr(I)); SetNodeText(Node, 'user', Profil.Benutzername); with TCipher_Rijndael.Create(PW, nil) do begin tmp := EncodeString(Profil.Passwort); Free; end; tmp := UTF8Encode(tmp); SetNodeText(Node, 'password', tmp); SetNodeText(Node, 'domain', Profil.Domain); SetNodeText(Node, 'desc', Profil.Beschreibung); end; end; var XMLDoc: IXMLDocument; begin if (not (FileExists(FileName))) then TFileStream.Create(FileName, fmCreate).Free; XMLDoc := TXMLDocument.Create(nil); XMLDoc.XML.Add('<?xml version="1.0" encoding="UTF-8"?>'); XMLDoc.XML.Add('<profile></profile>'); XMLDoc.Active := true; DoSave(XMLDoc); XMLDoc.SaveToFile(FileName); end; |
Re: XML: #4 (usw.) abspeichern
Kein Ahnung wie SetNodeText() aussieht, aber die Zeile muss weg:
Delphi-Quellcode:
marabu
tmp := UTF8Encode(tmp);
|
Re: XML: #4 (usw.) abspeichern
Hi,
ich bin echt vergesslich zur Zeit :duck:
Delphi-Quellcode:
Wenn ich das mit UTF8Encode weglasse, klappt das leider trotzdem nicht. Der Fehler bleibt :(
procedure SetNodeText(Node: IXMLNode; Name, Value: WideString);
var Temp: IXMLNode; begin if Node <> nil then begin Temp := Node.ChildNodes.FindNode(Name); if Temp = nil then Temp := Node.AddChild(Name); if Temp <> nil then Temp.Text := Value; end; end; |
Re: XML: #4 (usw.) abspeichern
Hallo Manuel,
du hast zwei Probleme, die sich zu allem Überfluß noch überlagern. Dein erstes Problem betrifft das encoding mit MSXML. Wenn da noch was unklar ist, frage ruhig nach. Dein zweites Problem hat mit dem cipher code zu tun. Die meisten Steuerzeichen (#0..#31) sind ungültige Zeichen. Dein cipher code produziert solche Zeichen. Du musst sie erst in gültige Zeichen übersetzen, damit keine exception geworfen wird. Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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