Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML: #4 (usw.) abspeichern (https://www.delphipraxis.net/61727-xml-4-usw-abspeichern.html)

Die Muhkuh 25. Jan 2006 17:47


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:
with TCipher_Rijndael.Create(PW, nil) do
      begin
        tmp := EncodeString(Profil.Passwort);
        Free;
      end;

      tmp := UTF8Encode(tmp);

      SetNodeText(Node, 'password', tmp); // [1]
Bei [1] kommt eine Exception:

Code:
---------------------------
Project1
---------------------------
An invalid character was found in text content.
---------------------------
OK  
---------------------------
Tja, hat wer eine Lösung parat? ;)

marabu 25. Jan 2006 21:10

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

Die Muhkuh 26. Jan 2006 12:59

Re: XML: #4 (usw.) abspeichern
 
Hi marabu,

am Besten zeig ich dir mal meine ganze Routine:

Delphi-Quellcode:
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;
Ich arbeite mit MSXML^^

marabu 26. Jan 2006 13:27

Re: XML: #4 (usw.) abspeichern
 
Kein Ahnung wie SetNodeText() aussieht, aber die Zeile muss weg:

Delphi-Quellcode:
tmp := UTF8Encode(tmp);
marabu

Die Muhkuh 26. Jan 2006 13:31

Re: XML: #4 (usw.) abspeichern
 
Hi,

ich bin echt vergesslich zur Zeit :duck:

Delphi-Quellcode:
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;
Wenn ich das mit UTF8Encode weglasse, klappt das leider trotzdem nicht. Der Fehler bleibt :(

marabu 26. Jan 2006 16:58

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