AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML TXMLDocument kann nicht created werden
Thema durchsuchen
Ansicht
Themen-Optionen

TXMLDocument kann nicht created werden

Ein Thema von Ykcim · begonnen am 24. Okt 2024 · letzter Beitrag vom 24. Okt 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#1

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 13:54
Delphi-Quellcode:
      XMLDcmnt := TXMLDocument.Create(xmlPfad);
      Try
         XMLDcmnt.LoadFromFile(xmlPfad);
Entweder schon beim Erstellen laden, oder erst später ... beides macht normal eigentlich niemand.
(ich würde den Parameter beim Create weglassen und nur LoadFromFile nutzen)

Und ja, das XMLDcmnt.Free weg und direkt als Interface die Variable. (wenn, dann maximal noch XMLDcmnt := nil; )


PS, bissl Kürzer wäre ReplaceStr, bzw, ReplaceText(XMLDcmnt.FileName, '.zip', '.xml') , aber eigentlich nutzt man doch ein ChangeFileExt(xmlPfad, '.xml') ?




Zitat:
Delphi-Quellcode:
   Finally
      Result:= false;
   End;
Das ergibt immer False ... wolltes du vielleicht ein Except?

Und wenn ja, dann schäm dich.
Fehlermeldungen blind wegzuwerfen und in garnichts oder nur einen Boolean zu konvertieren ... sowas gehört sich nicht.
* ordentiche Fehlermeldung
* oder wenigestens in ein Log schreiben

Was machst du denn außerhalb, bei einem False?

Delphi-Quellcode:
procedure TLogic.XMLEdit(xmlPfad: string; TargetPfad: string);
var WmDKntn: IXMLNode;
      XMLDcmnt: IXMLDocument;
      NwVlDateien, NwVlWF_Name, NwFlNm: string;
begin
      if TargetPfad[Length(TargetPfad)] <> '\then begin
         TargetPfad:= TargetPfad + '\';
      end;
      XMLDcmnt:= LoadXMLDocument(xmlPfad);
      NwFlNm:= ExtractFileName(StringReplace(XMLDcmnt.FileName,'.zip','.xml',[rfIgnoreCase, rfReplaceAll]));
      WmDKntn:= XMLDcmnt.DocumentElement;
      NwVlDateien:= StringReplace(WmDKntn.ChildNodes.FindNode('Dateien').ChildNodes.FindNode('Dateiname').NodeValue, '.zip','.xml',[rfIgnoreCase, rfReplaceAll]);
      NwVlWF_Name:= StringReplace(WmDKntn.ChildNodes.FindNode('WF_Name').ChildNodes.FindNode('WF_Name').NodeValue, '.zip','.xml',[rfIgnoreCase, rfReplaceAll]);
      WmDKntn.ChildNodes.FindNode('Dateien').ChildNodes.FindNode('Dateiname').NodeValue:= NwVlDateien;
      WmDKntn.ChildNodes.FindNode('WF_Name').ChildNodes.FindNode('WF_Name').NodeValue:= NwVlWF_Name;
      XMLDcmnt.SaveToFile(TargetPfad + NwVlDateien);
end;
Die Interfaces geben sich selbst frei
und die Fehlermeldung wird automatisch angezeigt.

Und beim Aufruf des XMLEdit kann man entweder abbrechen und Fehlermeldung anzeigen lassen
oder dort mit einem Try-Except die Sache entsprechend der Anforderungen dort behandeln. (alternativen Code ausführen lassen oder die Fehlermmeldung manuell anzeigen)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#2

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:25
Hallo himitsu,

vielen Dank für die guten Anregungen!

Zitat:
PS, bissl Kürzer wäre ReplaceStr, bzw, ReplaceText(XMLDcmnt.FileName, '.zip', '.xml') , aber eigentlich nutzt man doch ein ChangeFileExt(xmlPfad, '.xml') ?
Den Befehl kannte ich nicht - habe ich gerne übernommen.

Zitat:
Das ergibt immer False ... wolltes du vielleicht ein Except?
Stimmt, war ein Fehler!

Zitat:
Und wenn ja, dann schäm dich.
Fehlermeldungen blind wegzuwerfen und in garnichts oder nur einen Boolean zu konvertieren ... sowas gehört sich nicht.
* ordentiche Fehlermeldung
* oder wenigestens in ein Log schreiben
Ganz schön streng - finde ich aber gut, nur dann wird man besser!


Zitat:
Was machst du denn außerhalb, bei einem False?
Nur wenn ein True zurückgeliefert wird, wird die ursprüngliche Datei gelöscht. Der Benutzer sieht in drei FileListBoxes wie die Dateien bearbeitet und verschoben werden. In der FileListBox mit den ursprünglichen Download-Dateien soll am Ende nichts mehr drinstehen.

So sieht der ganze Ablauf aus jetzt aus:
Delphi-Quellcode:
procedure TFrm_BD_DHL.btn_ExtractDataClick(Sender: TObject);
var Logic: TLogic;
      FList: TStringList;
      I: integer;
      EditResult: boolean;
begin
   Logic:= TLogic.Create;
   FList:= TStringList.Create;
   Try
      //Erst nur die ZIP-Files mit den PDF-Files
      Logic.GetAllFilesEM(edt_DownloadPath.Text, 'zip', FList, false);
      for I := 0 to FList.Count -1 do begin
         EditResult:= EditMoveWmDFiles(FList[I], edt_PDFPath.Text, edt_XMLPath.Text);
         if EditResult then begin
            DeleteFile(FList[I]);
         end;
         FlLstbx_Download.Update;
         FlLstbx_PDF.Update;
         FlLstbx_XML.Update;
      end;
      //Zum Schluss die XML-Files, damit sie nicht vor dem Ablegen der PDF-Files verarbeitet werden
      FList.Clear;
      Logic.GetAllFilesEM(edt_DownloadPath.Text, 'xml', FList, false);
      for I := 0 to FList.Count -1 do begin
         EditResult:= EditMoveWmDFiles(FList[I], edt_PDFPath.Text, edt_XMLPath.Text);
         if EditResult then begin
            DeleteFile(FList[I]);
         end;
         FlLstbx_Download.Update;
         FlLstbx_PDF.Update;
         FlLstbx_XML.Update;
      end;
   Finally
      Logic.Free;
      FList.Free;
   End;
end;

function TFrm_BD_DHL.EditMoveWmDFiles(FilePath, PDFPath, XMLPath: string): boolean;
var Logic: TLogic;
begin
   Try
      Logic:= TLogic.Create;
      Try
         if LowerCase(ExtractFileExt(FilePath)) = '.zipthen begin
            Result:= Logic.ExctractZIP(FilePath, PDFPath);
         end;
         if LowerCase(ExtractFileExt(FilePath)) = '.xmlthen begin
            Result:= Logic.XMLEdit(FilePath, XMLPath);
         end;
      Finally
         Logic.Free;
      End;
   Except
      Result:= false;
   End;
end;


function TLogic.ExctractZIP(ZipPfad, ExtractPfad: string): boolean;
var ZFile: TZipFile;
begin
   Try
      ZFile:= TZipFile.Create;
      Try
         ZFile.Open(ZipPfad, zmRead);
         ZFile.ExtractAll(ExtractPfad);
         Result:= true;
      Finally
         ZFile.Free;
      End;
   Except
      Result:= false;
   End;
end;


function TLogic.XMLEdit(xmlPfad: string; TargetPfad: string): Boolean;
var WmDKntn: IXMLNode;
      XMLDcmnt: IXMLDocument;
      NwVlDateien, NwVlWF_Name, NwFlNm: string;
begin
   Try
      if TargetPfad[Length(TargetPfad)] <> '\then begin
         TargetPfad:= TargetPfad + '\';
      end;
      XMLDcmnt:= LoadXMLDocument(xmlPfad);
      NwFlNm:= ChangeFileExt(ExtractFileName(xmlPfad), '.xml');
      WmDKntn:= XMLDcmnt.DocumentElement;
      NwVlDateien:= StringReplace(WmDKntn.ChildNodes.FindNode('Dateien').ChildNodes.FindNode('Dateiname').NodeValue, '.zip','.xml',[rfIgnoreCase, rfReplaceAll]);
      NwVlWF_Name:= StringReplace(WmDKntn.ChildNodes.FindNode('WF_Name').ChildNodes.FindNode('WF_Name').NodeValue, '.zip','.xml',[rfIgnoreCase, rfReplaceAll]);
      WmDKntn.ChildNodes.FindNode('Dateien').ChildNodes.FindNode('Dateiname').NodeValue:= NwVlDateien;
      WmDKntn.ChildNodes.FindNode('WF_Name').ChildNodes.FindNode('WF_Name').NodeValue:= NwVlWF_Name;
      XMLDcmnt.SaveToFile(TargetPfad + NwVlDateien);
      Result:= true;
   Except
      MessageDlg('Die Datei ' + xmlPfad + ' konnte nicht editiert werden. Bitte manuell eingreifen und den Administrator informieren.', mtError, [mbOK], 0);
      Result:= false;
   End;
end;
Vielen Dank
Patrick
Patrick

Geändert von Ykcim (24. Okt 2024 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#3

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:38
Zitat:
den Administrator informieren
Wenn jetzt noch die Exception.Message in dem Dialog oder einer Logdatei stünde, dann hatte der arme Admin einen Hinweis darauf, was nicht ging.

MessageBoxen zur Fehlerbehandlung haben den Nachteil, dass man außenrum nichts mehr machen kann.
Direkt mit Exceptions zu arbeiten hatt den Voreil, dass man beim Aufrufer reagieren kann.
* Zusatzinfos im Fehlertext
* oder eben nochmal Alternatives versuchen try Speichere; except SpeichereAndersOderWoanders; end; Wir hatten so eine Funktion erst im Client, welche in der x-ten Ebene versteckt mit einem ShowMessage den Fehler anzeigte.
Als diese Funktion dann in einem Dienst benutzt wurde, welcher keinen Zugriff auf einen Monitor hatte ... da blieb das Programm dann wunderschön hängen, ohne dass es tagelang jemand bemerkte ... und selbst danach, wusste erstmal niemand, warum es hängt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#4

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 16:34
Hallo himitsu,

dazu habe ich eine Frage - etwas out of topic.

Es handelt sich hierbei um eine Client-Server-App und ich sende Messages an den Client zwecks Logging. Aber wie kann ich einen Fehler melden und auch Exception-Daten verwenden, wenn try/except verwende.
Wie komme ich im except-Teil an die Exception, damit ich die Meldung verarbeiten kann? In der Vergangenheit habe ich meistens mit einem GlobalExceptionHandler gearbeitet...

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
323 Beiträge
 
Delphi 12 Athens
 
#5

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 16:37
Code:
Try
//...
Except on E : Exception
  Do Begin
     ShowMessage(E.Message);
     End;
End;
Vielleicht habe ich ja was missverstanden, aber diese Konstruktion hier sollte das doch tun, oder?
Logischerweise kann man alle möglichen Dinge mit der Exception dann machen...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.339 Beiträge
 
Delphi 12 Athens
 
#6

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 16:42
https://docwiki.embarcadero.com/RADS...tions_(Delphi)


Delphi-Quellcode:
except
  on E: Exception do begin
    MachWas(E.ClassName + ' ' + E.Message);
  end;
end;
Delphi-Quellcode:
except
  on E: Exception do
    if E is EFileError then
      MachWasAnderes(E.ClassName + ' ' + E.Message)
    else
      MachWas(E.ClassName + ' ' + E.Message);
end;
Delphi-Quellcode:
except
  on ESpecialError do
    Sonstwas; // ja, Die Variable muß man nicht angeben, wenn man sie nicht braucht und sie muß nicht zwangsweise E heißen, aber 99,998% nennen sie so
  on E: EFileError do
    MachWasAnderes(E.ClassName + ' ' + E.Message);
  on E: Exception do
    MachWas(E.ClassName + ' ' + E.Message);
end;




Delphi-Quellcode:
except
  MachWas(Exception(ExceptObject).Message);
end;

finally
  if ExceptObject <> nil then
    MachWas(Exception(ExceptObject).Message); // egal wo ... sobald ExceptObject nicht nil, ist man gerade irgendwo in einer Fehlerbehandlung
end;
aber psssssst
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (24. Okt 2024 um 16:45 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#7

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 16:59
Vielen Dank!

Das werde ich versuchen in meine Apps einzubauen!

LG Patrick
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:42 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