![]() |
TXMLDocument kann nicht created werden
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:
Ich habe es auch schon mit
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;
Delphi-Quellcode:
XMLDcmnt:= TXMLDocument.Create(xmlPfad);
versucht, aber das hatte keinen Einfluss. Kann mir jemand sagen, was ich falsch mache? Die Fehlermeldung besagt Zitat:
Patrick |
AW: TXMLDocument kann nicht created werden
Zitat:
|
AW: TXMLDocument kann nicht created werden
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... |
AW: TXMLDocument kann nicht created werden
Halölle...8-)
versuche Mal:
Delphi-Quellcode:
PS:
XMLDcmnt: IXMLDocument;
... Finally XMLDcmnt.Free; // könnte dann weg weil ist ein interface End; Du arbeitest auch mit
Delphi-Quellcode:
Klassen und interfaces zu mischen ist imho keine gute Idee. :wink:
WmDKntn: IXMLNode;
|
AW: TXMLDocument kann nicht created werden
Ich create ein TXMLDocument immer mit einer Dummy-Componente als Owner, niemals mit nil, so wie hier beschrieben:
![]() |
AW: TXMLDocument kann nicht created werden
Hallo Zusammen,
vielen Dank!!! Ich bin gerade auch über diese Beitrag gestolpert, als ich mal nach "Delphi TXMLDocument.Create" gesucht habe...: ![]() Ich habe es jetzt geändert und so scheint es zu funktionieren:
Delphi-Quellcode:
Vielen Dank
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; Patrick |
AW: TXMLDocument kann nicht created werden
Spinne ich, oder gibt die Funktion in jedem Fall false zurück?
|
AW: TXMLDocument kann nicht created werden
:lol:
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 |
AW: TXMLDocument kann nicht created werden
Delphi-Quellcode:
Entweder schon beim Erstellen laden, oder erst später ... beides macht normal eigentlich niemand.
XMLDcmnt := TXMLDocument.Create(xmlPfad);
Try XMLDcmnt.LoadFromFile(xmlPfad); (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
Delphi-Quellcode:
)
XMLDcmnt := nil;
PS, bissl Kürzer wäre ReplaceStr, bzw,
Delphi-Quellcode:
, aber eigentlich nutzt man doch ein
ReplaceText(XMLDcmnt.FileName, '.zip', '.xml')
Delphi-Quellcode:
?
ChangeFileExt(xmlPfad, '.xml')
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 Was machst du denn außerhalb, bei einem False?
Delphi-Quellcode:
Die Interfaces geben sich selbst frei
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; 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) |
AW: TXMLDocument kann nicht created werden
Hallo himitsu,
vielen Dank für die guten Anregungen! Zitat:
Zitat:
Zitat:
Zitat:
So sieht der ganze Ablauf aus jetzt aus:
Delphi-Quellcode:
Vielen Dank
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)) = '.zip' then begin Result:= Logic.ExctractZIP(FilePath, PDFPath); end; if LowerCase(ExtractFileExt(FilePath)) = '.xml' then 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; Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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 by Thomas Breitkreuz