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
Seite 1 von 2  1 2      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#1

TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:04
Hallo Zusammen,

ich hänge an einem ganz doofen Fehler fest:
Ich arbeite das erste Mal mit xml-Files und möchte zwei Werte ändern. Nachdem ich jetzt lange erfolglos es versucht habe - inkl. Internetsuche, habe ich eine neues Projekt eröffnet. In diesem habe ich ein TXMLDocument auf das Form gelegt und es hat wunderbar geklappt.

Dann wollte ich das Ganze in mein eigentliches Project überführen und es klappt wieder nicht. Ich glaube das Ganze hängt an dem Create-Aufruf, obwohl dort nicht der Fehler auftritt. Denn wenn ich in dem TestProjekt das TXMLDocument Object wieder lösche und das ganze im Code create, klappt es nur, wenn ich dem Parent "Self" eintrage. Wenn ich wie in meinem eigentlichen Projekt "nil" eintrage, klappt es auch nicht. Das Ganze findet aber ein einer Klasse statt, sodass Self nicht funktioniert.

Delphi-Quellcode:
function TLogic.XMLEdit(xmlPfad: string; TargetPfad: string): Boolean;
var WmDKntn: IXMLNode;
      XMLDcmnt: TXMLDocument;
      NwVlDateien, NwVlWF_Name: string;
begin
   Try
      XMLDcmnt:= TXMLDocument.Create(xmlPfad);
      Try
         XMLDcmnt.LoadFromFile(xmlPfad);
         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;
      Finally
         XMLDcmnt.Free;
      End;
   Finally
      Result:= false;
   End;
end;
Ich habe es auch schon mit
XMLDcmnt:= TXMLDocument.Create(xmlPfad);
versucht, aber das hatte keinen Einfluss.

Kann mir jemand sagen, was ich falsch mache?

Die Fehlermeldung besagt
Zitat:
Ungültige Zeigeroperation
Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
123 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:13
Kann mir jemand sagen, was ich falsch mache?
Findet das Ganze in einem Thread statt und wenn ja, hast du vorher ein CoInitialize aufgerufen?
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:20
Hallo shebang,

vielen Dank für Deine Frage. Das ganze findet nicht in einem extra Thread, sondern direkt im Hauptthread statt.
Was mich wundert ist, dass es nur funktioniert, wenn ich ein TXMLDocument auf das Form lege (geht nicht, weil die Procedure in einer Klasse stattfindet) oder ich als Parent "Self" angebe (Geht nicht, weil die Procedure in einer Klasse sattfindet).

Ich bin ratlos...
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#4

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:24
Halölle...

versuche Mal:
Delphi-Quellcode:
XMLDcmnt: IXMLDocument;

...
Finally
  XMLDcmnt.Free; // könnte dann weg weil ist ein interface
End;
PS:
Du arbeitest auch mit WmDKntn: IXMLNode; Klassen und interfaces zu mischen ist imho keine gute Idee.

Geändert von haentschman (24. Okt 2024 um 14:27 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
702 Beiträge
 
Delphi 12 Athens
 
#5

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:24
Ich create ein TXMLDocument immer mit einer Dummy-Componente als Owner, niemals mit nil, so wie hier beschrieben:
http://www.delphipraxis.net/185202-x...exception.html
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:31
Hallo Zusammen,

vielen Dank!!!

Ich bin gerade auch über diese Beitrag gestolpert, als ich mal nach "Delphi TXMLDocument.Create" gesucht habe...: https://stackoverflow.com/questions/...nent-on-the-fo


Ich habe es jetzt geändert und so scheint es zu funktionieren:
Delphi-Quellcode:
function TLogic.XMLEdit(xmlPfad: string; TargetPfad: string): Boolean;
var WmDKntn: IXMLNode;
      XMLDcmnt: IXMLDocument; //Änderung
      NwVlDateien, NwVlWF_Name, NwFlNm: string;
begin
   Try
      //XMLDcmnt:= TXMLDocument.Create(xmlPfad); WEG
      Try
         //XMLDcmnt.LoadFromFile(xmlPfad); WEG
         XMLDcmnt:= LoadXMLDocument(xmlPfad); //HINZU
         NwFlNm:= 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);
         Result:= true;
      Finally
         //XMLDcmnt.Free; WEG, weil nicht created
      End;
   Finally
      Result:= false;
   End;
end;
Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.616 Beiträge
 
Delphi 12 Athens
 
#7

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:33
Spinne ich, oder gibt die Funktion in jedem Fall false zurück?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14:38

Nein, du spinnst nicht

Ich hatte vergessen das letzte Finally noch in ein Except ändern... So sieht es jetzt aus!

Delphi-Quellcode:
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:= 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);
      Result:= true;
   Except
      Result:= false;
   End;
end;

Vielen Dank an alle!!!
LG Patrick
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 14: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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
824 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: TXMLDocument kann nicht created werden

  Alt 24. Okt 2024, 15: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 17:35 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:30 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