Zeichen in einem Filestream ersetzten, bzw. Filestream in Stringlist lesen und dort Zeichen ersetztenb

    Zeichen in einem Filestream ersetzten, bzw. Filestream in Stringlist lesen und dort Zeichen ersetztenb

    Hallo liebe Gemeinde,
    nach langer Zeit melde ich mich auch mal wieder zu Wort. Ich möchte ein Programm zum Tracking von UPS Sendungen erstellen.
    Das hat auch schon soweit funktioniert, biss UPS sich entschlossen hat in der XML-Datei die zurückgeschickt wird Zeichen wie '®' zu verwenden.

    Daher bekomme ich beim Laden des Streams in mein TXMLDocument eine schöne Fehlermeldung zwecks ungültiger Zeichen.
    Vor dem Hintergrund habe ich jetzt vor, das '®' durch '(R)' zu ersetzten, oder gleich raus zu löschen.
    Wie ihr aus nachfolgenedm Code ersehen könnt, ist die Antwort-XML-Datei die ich von UPS bekomme in dem Filestraem ResponseStream geparkt. Mein Ansatzs war jetzt, diesen Straem in eine StringList zu laden, das Zeichen zu ersetzten und dann die StringList wieder in den Stream zu speichern.

    Nachfolgend mal mein Code:

    Delphi-Code

    1. Var
    2. RequestStream : TFileStream;
    3. ResponseStream : TFileStream;
    4. IdHTTP : TIdHTTP;
    5. IdSSL : TIdSSLIOHandlerSocketOpenSSL;
    6. MyString : String;
    7. Params : TStringStream;
    8. begin
    9. // Create
    10. RequestStream := TFileStream.Create('.\XmlRequest.xml', fmOpenRead or fmShareDenyWrite or fmCreate);
    11. ResponseStream := TFileStream.Create('.\XmlResponse.xml', fmCreate);
    12. Params := TStringStream.create('');
    13. IdHTTP := TIdHTTP.Create(Nil);
    14. IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(Nil);
    15. IdSSL.SSLOptions.SSLVersions := [sslvSSLv23];
    16. IdHTTP.IOHandler := IdSSL;
    17. IdHTTP.AllowCookies := True;
    18. MyString := '<?xml version="1.0" ?>' + #10 +
    19. '<AccessRequest xml:lang="ger-DE">' + #10 +
    20. ' <AccessLicenseNumber>' + LIC + '</AccessLicenseNumber>' + #10 +
    21. ' <UserId>' + UID + '</UserId>' + #10 +
    22. ' <Password>' + PID + '</Password>' + #10 +
    23. '</AccessRequest>' + #10 +
    24. '<TrackRequest>' + #10 +
    25. ' <Request>' + #10 +
    26. ' <TransactionReference>' + #10 +
    27. ' <CustomerContext>guidlikesubstance</CustomerContext>' + #10 +
    28. ' </TransactionReference>' + #10 +
    29. ' <RequestAction>Track</RequestAction>' + #10 +
    30. ' <RequestOption>1</RequestOption>' + #10 +
    31. ' </Request>' + #10 +
    32. ' <TrackingNumber>' + Self.TrackingID + '</TrackingNumber>' + #10 +
    33. '</TrackRequest>';
    34. Params.WriteString(MyString);
    35. IdHTTP.Post(WebPage, Params, ResponseStream);
    36. MyStringList := TStringList.Create;
    37. MyStringList.LoadfromStream(ResponseStream);
    38. MyStringList.Text := StringReplace(MyStringList.Text, '®', '(R)', [rfReplaceAll, rfReplaceAll ]);
    39. MyStringList.SaveToStream(ResponseStream);
    40. MyStringList.Free;
    41. XMLDocument.LoadFromStream(ResponseStream);


    Schreibe ich selber einen Text in die StringList dann klappt das ersetzten problemlos.
    Beim Laden des Streams in die StringList bleibt diese jedoch leer.
    Nach Freigabe des Streams ist in der XML-Datei der komplette 'fehlerhafte' Text enthalten.

    Wie kann ich das denn lösen?
    Meistens sind es die 'einfachen Dinge', die das Leben kompliziert machen.

    Meine Umgebung:
    Delphi 2007 / M$ - Win 7/ M$ - Server 2012 / M$ - SQL-Server 2014 / M$ - WinXP
    Hmm..

    Da die Stringliste leer bleibt, habe ich eine ganz andere Vermutung:
    Kann es sein, das als Result ein Unicode-String kommt?
    D2007 ist ja noch Ansi und wenn Du dann den Stream in die StringListe lädst, wird direkt beim ersten Zeichen abgebrochen, da es mit #0 beginnt/endet (2 Bytes Je Char..)

    Speicher mal den Stream ab und öffne ihn mit Notepad.. ;)