![]() |
XMLDocument zur Laufzeit -> Exception
Hallo,
ich habe ein Problem beim Einlesen vom XML Daten aus einem Stream. Lege ich die XMLDocument Komponente auf eine Form ("XMLDoc") lassen sich die Inhalte problemlos auslesen:
Delphi-Quellcode:
Möchte ich die Funktionalität jedoch auslagern und das XMLDocument zu Laufzeit erzeugen, dann wird beim Abfragen der Struktur eine Exception ausgeworfen.
function LoadWebData(xmlResponse : TMemoryStream) : boolean;
var StartItemNode: IXMLNode; begin Result := true; try XMLDoc.LoadFromStream(xmlResponse); except; Result := false; exit; end; XMLDoc.Active := True; try StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('response') ; except end; end;
Delphi-Quellcode:
Was mache ich hier falsch? Habe ich vergessen, eine Eigenschaft zu setzen?
function LoadWebData(xmlResponse : TMemoryStream) : boolean;
var XMLDoc : TXMLDocument; StartItemNode: IXMLNode; begin Result := true; XMLDoc := TXMLDocument.Create(NIL); try XMLDoc.DOMVendor := DOMVendors.Find('Omni XML'); XMLDoc.Options := [doAttrNull,doAutoPrefix,doNamespaceDecl]; try XMLDoc.LoadFromStream(xmlResponse); except; Result := false; exit; end; XMLDoc.Active := True; try StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('response') ; // <= Exception except end; // .... finally XMLDoc.Active := false; XMLDoc := NIL; end; end; Vielen Dank, für jeden Hinweis. |
AW: XMLDocument zur Laufzeit -> Exception
Wurde der Stream auch wieder an den Anfang zurück gesetzt an die stelle an der die XML-Daten kommen. Bei LoadFromStream wird oft an der stelle das lesen begonnen an der gerade der Stream steht.
|
AW: XMLDocument zur Laufzeit -> Exception
Hallo,
Du meinst
Delphi-Quellcode:
vor XMLDoc.LoadFromStream?
xmlResponse.Position := 0;
Nein, das bringt leider auch nichts. |
AW: XMLDocument zur Laufzeit -> Exception
Tipp des Jahrhunderts: Erstelle nie ein TXMLDocument mit Owner = nil.
Dadurch erhält man unter Umständen komische, nicht nachvollziehbare Exceptions. Im Zweifelsfall erstell dir eine temporäre TComponent-Instanz die du dem constructor von TXMLDocument mitgibst. Hauptsache nicht nil! Achja: Du musst das xml Dokument im finally wieder freigeben. Auf nil setzen reicht nicht! |
AW: XMLDocument zur Laufzeit -> Exception
In XMLDoc.ParseOptions ist nichts mit Async aktiv?
Ach ja, entweder
Delphi-Quellcode:
oder
var XMLDoc : TXMLDocument;
XMLDoc.Free;
Delphi-Quellcode:
var XMLDoc : IXMLDocument;
XMLDoc := NIL; |
AW: XMLDocument zur Laufzeit -> Exception
Zitat:
@himitsu: Danke für die Erklärung des Unterschieds :thumb: |
AW: XMLDocument zur Laufzeit -> Exception
Sowas halt (falls du wie gesagt irgendwas anderes rumfliegen hast, dann kannst du das stattdessen auch übergeben und musst keine temporäre Instanz erstellen):
Delphi-Quellcode:
function LoadWebData(xmlResponse : TMemoryStream) : boolean;
var XMLDoc : TXMLDocument; StartItemNode: IXMLNode; dummyComp: TComponent; begin Result := true; dummyComp := TComponent.Create(nil); // <-- try XMLDoc := TXMLDocument.Create(dummyComp); // <-- try XMLDoc.DOMVendor := DOMVendors.Find('Omni XML'); XMLDoc.Options := [doAttrNull,doAutoPrefix,doNamespaceDecl]; try XMLDoc.LoadFromStream(xmlResponse); except; Result := false; exit; end; XMLDoc.Active := True; try StartItemNode := XMLDoc.DocumentElement.ChildNodes.FindNode('response') ; // <= Exception except end; // .... finally XMLDoc.Active := false; XMLDoc := NIL; end; finally dummyComp.Free; end; end; |
AW: XMLDocument zur Laufzeit -> Exception
:thumb: :thumb: Super, besten Dank. Das wars. Man lernt nie aus :idea:
|
AW: XMLDocument zur Laufzeit -> Exception
Könnte man nicht vielleicht doch den leeren 'except' Block entfernen? Das ist ja grauenvoll.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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