Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Beim XML laden bleibt die Anwendung einfach hängen (https://www.delphipraxis.net/98365-beim-xml-laden-bleibt-die-anwendung-einfach-haengen.html)

gsh 26. Aug 2007 00:50


Beim XML laden bleibt die Anwendung einfach hängen
 
Hi Leute

Ich komm hier einfach nicht weiter.
Ich versuche Daten aus einer XML Datei zu lesen aber irgendwie geht gar nichts und die Anwendung bleibt einfach hängen.
Delphi-Quellcode:
function XML_Load(XMLFilename : String; VST : TVirtualStringTree) : Boolean;
var
  XMLDocument : TXMLDocument;
begin
  Result := true;
  try
    XMLDocument := TXMLDocument.Create(nil);
    try
      XMLDocument.NodeIndentStr := '<2 Leerzeichen>';
      XMLDocument.FileName := XMLFilename;
      if (not(FileExists(XMLFilename))) or (XMLDocument.IsEmptyDoc) then
      begin
        XMLDocument.LoadFromXML('<?xml version="1.0"?><'+cXMLRootNodeName+'></'+cXMLRootNodeName+'>');
        XMLDocument.SaveToFile;
      end;
      try
        XMLDocument.Active := true;
      except
        ShowMessage('XML Fehler: Die Datei "'+XMLFilename+'" ist fehlerhaft.');
        Result := false;
      end;
      //Des sind die verschiedenen Möglichkeiten die ich getestet hab
1.   ShowMessage(XMLDocument.DocumentElement.NodeName); //Hier bleibt er einfach stehen
2.   ShowMessage(XMLDocument.Node.ChildNodes.Last.NodeName);//hier funktionierts ABER bei dem bleibt er bei FreeAndNil(XMLDocument); dann hängen
3.   ShowMessage(XMLDocument.ChildNodes.Last.NodeName);//hier funktionierts auch bleibt aber wieder hier FreeAndNil(XMLDocument); hängen
    finally
      FreeAndNil(XMLDocument);
    end;
  except
    ShowMessage('XML Fehler: Fehler beim Laden des XML Documents');
    Result := false;
  end;
end;
Und hängen bleiben versteh ich: Er geht in die Codezeile hinein (Debugger) geht aber nie mehr raus und die Anwendung ist absolut eingefroren

Ich will den Root Knoten bekommen als Variable heraus bekommen ... nur so nebenbei

semo 26. Aug 2007 00:58

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
könntest du mal die xml datei anhängen?
oder stellt das ein problem dar?
ich hab da mal vor ner weile ein kleines xml check tool geschrieben.
kann ich da ja mal durchjagen....

gsh 26. Aug 2007 01:04

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Ist absolute kein Problem
aber ich glaub nicht des da dein Check tool so viel findet
XML-Code:
<?xml version="1.0"?>
<List></List>

semo 26. Aug 2007 01:34

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
puuhhhh: dein code ist ein wenig chaotisch....
Delphi-Quellcode:
      XMLDocument.NodeIndentStr := '<2 Leerzeichen>'; // ist für das Auslesen unrelevant, benötigts du doch erst beim Erstellen
      XMLDocument.FileName := XMLFilename;
      if (not(FileExists(XMLFilename))) or {OK}
        (XMLDocument.IsEmptyDoc) then { IsEmptyDoc kann man doch erst nach einem LoadFromFile oder derartiges aufrufen?!} 
      begin
        XMLDocument.LoadFromXML('<?xml version="1.0"?><'+cXMLRootNodeName+'></'+cXMLRootNodeName+'>');
        XMLDocument.SaveToFile;
      end;
dein code:
Delphi-Quellcode:
     
try
  XMLDocument.Active := true;
except
  ShowMessage('XML Fehler: Die Datei "'+XMLFilename+'" ist fehlerhaft.');
  Result := false;
end;

//Des sind die verschiedenen Möglichkeiten die ich getestet hab
1. Möglichkeit
2. Möglichkeit
3. Möglichkeit
--> sollte so aussehen:
Delphi-Quellcode:
     
try
  XMLDocument.Active := true;

  { hier fehlt meines Erachtens nach das Laden des XML Files }

  //Des sind die verschiedenen Möglichkeiten die ich getestet hab
  1. Möglichkeit oder
  2. Möglichkeit oder
  3. Möglichkeit
except
  ShowMessage('XML Fehler: Die Datei "'+XMLFilename+'" ist fehlerhaft.');
  Result := false;
end;
Weil wenn bei dir da was fehlschlägt,
dann macht er ja trotzdem weiter mit deinen Möglichkeiten.

gsh 26. Aug 2007 09:10

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Zitat:

Zitat von computer-glossar.de
Delphi-Quellcode:
      XMLDocument.NodeIndentStr := '<2 Leerzeichen>'; // ist für das Auslesen unrelevant, benötigts du doch erst beim Erstellen
      XMLDocument.FileName := XMLFilename;
      if (not(FileExists(XMLFilename))) or {OK}
        (XMLDocument.IsEmptyDoc) then { IsEmptyDoc kann man doch erst nach einem LoadFromFile oder derartiges aufrufen?!} 
      begin
        XMLDocument.LoadFromXML('<?xml version="1.0"?><'+cXMLRootNodeName+'></'+cXMLRootNodeName+'>');
        XMLDocument.SaveToFile;
      end;

ok NodeIndentStr ist jetzt nur noch beim speichern drinnen
IsEmptyDoc ist auch weg

dein code:
Delphi-Quellcode:
     
try
  XMLDocument.Active := true;
except
  ShowMessage('XML Fehler: Die Datei "'+XMLFilename+'" ist fehlerhaft.');
  Result := false;
  exit;
end;

//Des sind die verschiedenen Möglichkeiten die ich getestet hab
1. Möglichkeit
2. Möglichkeit
3. Möglichkeit
Weil wenn bei dir da was fehlschlägt,
dann macht er ja trotzdem weiter mit deinen Möglichkeiten.[/quote]
nein
ich hab nur vergessen nach dem ersten except block ein exit aufzurufen (weil ich des früher anderes gemacht hab)


Aber des Problem das er einfach stecken bleibt ist immer noch da :wall:

semo 26. Aug 2007 09:28

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
kannst du deine xml_tlb.pas mal anhängen? habe hier msxml 6.0 importiert....

gsh 26. Aug 2007 09:43

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Also ich nutze diese units
Delphi-Quellcode:
uses xmldom, XMLIntf, msxmldom, XMLDoc

semo 26. Aug 2007 10:02

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
ShowMessage(XMLDocument.DocumentElement. NodeName);
--> hier bekomme ich als ShowMessageDialog den String 'List' angezeigt

ShowMessage(XMLDocument.Node.ChildNodes.Last.NodeN ame);
--> es existieren keine Childnodes in deinem XML Dokument!

ShowMessage(XMLDocument.ChildNodes.Last.NodeName);
--> es existieren keine Childnodes in deinem XML Dokument!

gsh 26. Aug 2007 10:13

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
hmm ja
aber wenn ich ShowMessage(XMLDocument.DocumentElement.NodeName); aufrufe dann bleibt er einfach in der zeile hängen

semo 26. Aug 2007 10:15

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
sicher?
vielleicht ist der dialog einfach nur in den hintergrund gerutscht?
dann schaut es so aus als wenn nix mehr geht...

jim_raynor 26. Aug 2007 10:19

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Zitat:

Zitat von gsh
Aber des Problem das er einfach stecken bleibt ist immer noch da :wall:

Funktioniert es denn ohne Debugger? Wenn ja, versuche mal alle "überwachten Ausdrücke" zu löschen. Hatte es jetzt schon öfter gehabt, dass der Debugger sich beim Auswerten aufgehangen hat ...

gsh 26. Aug 2007 10:26

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Zitat:

Zitat von computer-glossar.de
sicher?
vielleicht ist der dialog einfach nur in den hintergrund gerutscht?
dann schaut es so aus als wenn nix mehr geht...

ne ist er nicht
selbst wenn ich nur XMLDocument.DocumentElement.NodeName; aufrufe bleibt er hängen

Zitat:

Zitat von jim_raynor
Zitat:

Zitat von gsh
Aber des Problem das er einfach stecken bleibt ist immer noch da :wall:

Funktioniert es denn ohne Debugger? Wenn ja, versuche mal alle "überwachten Ausdrücke" zu löschen. Hatte es jetzt schon öfter gehabt, dass der Debugger sich beim Auswerten aufgehangen hat ...

überwachten ausdrücke sind gelöscht
funkt ohne debugger auch nicht

semo 26. Aug 2007 10:26

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
oder ruf einfahc die erzeugte EXE auf....

gsh 26. Aug 2007 10:29

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Zitat:

Zitat von computer-glossar.de
oder ruf einfahc die erzeugte EXE auf....

hab ich doch ... geht nicht

marabu 26. Aug 2007 10:41

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Hallo ihr beiden,

das Code-Gerüst sollte besser so aussehen:

Delphi-Quellcode:
function XML_Load(fn: TFileName; vst: TVirtualStringTree): Boolean;
var
  xDoc: IXMLDocument;
begin
  xDoc := LoadXmlDocument(fn);
  with xDoc do
  try
    Active := True;
    ShowMessage(documentElement.NodeName);
    {
    ...
    }
    Result := True;
  except
    Result := False;
  end;
end;
Achtet auf den Typ der lokalen Variable xDoc. Ein Einfrieren des Programms kann ich mir so nicht vorstellen.

Grüße vom marabu

gsh 26. Aug 2007 10:53

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
hmm wenn ich das objekt so
XMLDocument := LoadXMLDocument(XMLFilename); erstelle dann geht es sogar ... es gibt dann nur ziemlich viele speicherleaks :(
aber ich versteh nicht warum ich des objekt nicht so erstellen kann XMLDocument := TXMLDocument.Create(nil);

marabu 26. Aug 2007 14:08

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Hallo Alex,

da gibt es ein kleines Problem mit Borlands Implementierung dieser Methode, das erzeugte VCL-Objekt TXMLDocument wird so nie freigegeben.

Also besser so:

Delphi-Quellcode:
function XML_Load(fn: TFileName; vst: TVirtualStringTree): Boolean;
var
  xDoc: TXMLDocument;
begin
  xDoc := TXMLDocument.Create(Application);
  with xDoc do
  try
    try
      FileName := fn;
      Active := True;
      ShowMessage(documentElement.NodeName);
      {
      ...
      }
      Result := True;
    except
      Result := False;
    end;
  finally
    Free;
  end;
end;
Freundliche Grüße

gsh 26. Aug 2007 15:05

Re: Beim XML laden bleibt die Anwendung einfach hängen
 
Hab den Fehler gefunden
So gehts nicht: XMLDocument := TXMLDocument.Create(nil);
So gehts: XMLDocument := TXMLDocument.Create(Application);
Danke leute :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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