Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Exception beim Zugriff auf ersten XML Knoten (https://www.delphipraxis.net/170243-exception-beim-zugriff-auf-ersten-xml-knoten.html)

little_budda 6. Sep 2012 20:02

Exception beim Zugriff auf ersten XML Knoten
 
Hallo,

ich befürchte fast ja das meine Frage breits eine Lösung gefunden hat, konnte hier im Forum aber keinen passende Eintrag finden.

Nun denn.
Ich versuche eine XML Datei einzulesen um ein paar Werte zu ermitteln.
Dabei lande ich immer in einer Exception.

Hier meine XML Datei
Code:
<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<AssemblyInfo>
    <Firmware>
        <Info Name="VE E01H0001" Version="02.08.00.01" Date="18.06.2012" />
    </Firmware>
    <SystemInfo>  
        <Info Name="Datenträger 1 (Storage Card)" />
        <Info Name="Gesamt/Freier Speicher" Var="124140 / 105550 KB" />
        <Info Name="Ethernet-Schnittstelle ETH01" />
        <Info Name="Geschwindigkeit" Var="100 MBit/s" />
    </SystemInfo>
</AssemblyInfo>
Mein bisheriger Code dazu
Delphi-Quellcode:
procedure SetContentForTabSheetAssemblyInfo;
var XmlDoc : TXMLDocument ;
    RootNode : IXMLNode ;
    Firmware : IXMLNode ;
    InfoNode : IXMLNode ;
    xmlFileName, xmlValueName, xmlValueVersion, xmlValueDate : string ;
    XmlDocIsEmpty : boolean;
begin
  XmlDoc := TXMLDocument.Create (nil);
  xmlFileName := currentPathWithArchiveContent + '\' + sZipFileXmlFolder + '\' + aZipFileSrvXmlFiles[0];
  if (FileExists(xmlFileName) = true) then
    begin
      XmlDoc.LoadFromFile(xmlFileName);
      XmlDoc.Active := true ;

      if (XmlDoc.IsEmptyDoc = false) then
       begin
                      // Hier bekomme ich immer eine Exception (Ungültige Zeigeroperation)
          RootNode := XmlDoc.DocumentElement.ChildNodes.Nodes['AssemblyInfo'];

          Firmware := RootNode.ChildNodes.Nodes[0];
          InfoNode := Firmware.ChildNodes.Nodes[0];

          xmlValueName := InfoNode.ChildValues['Name'];
          xmlValueVersion := InfoNode.ChildValues['Version'];
          xmlValueDate := InfoNode.ChildValues['Date'];

       end;

       XmlDoc.Free;
    end;
end;
Ich hoffe es hat jemand eine Idee dazu.
:?:

himitsu 6. Sep 2012 20:53

AW: Exception beim Zugriff auf ersten XML Knoten
 
Zitat:

Delphi-Quellcode:
// Hier bekomme ich immer eine Exception (Ungültige Zeigeroperation)
RootNode := XmlDoc.DocumentElement.ChildNodes.Nodes['AssemblyInfo'];

Schonmal auf die wahnwitzige Idee gekommen den Debugger zu benutzen und/oder diesen verschachtelten Aufruf mehrere Methoden in einzelaufrufe zu zerlegen und einzeln zu testen? :stupid:

Tipp: Rate mal was das DocumentElement (RootNode) ist und wieso man darin keinen (weiteren) Knoten, mit dem Namen "AssemblyInfo" findet.

little_budda 7. Sep 2012 08:14

AW: Exception beim Zugriff auf ersten XML Knoten
 
Zitat:

Schonmal auf die wahnwitzige Idee gekommen den Debugger zu benutzen und/oder diesen verschachtelten Aufruf mehrere Methoden in einzelaufrufe zu zerlegen und einzeln zu testen?
Ja sicher, hab ich auch schon mal getan.
Die Exception kam auch wenn ich nur folgendes aufgerufen habe
Code:
RootNode := XmlDoc.DocumentElement;
Aber mein Problem ist weg.
Lösen lies sich dies durch das Zuweisen des Owners.
Delphi-Quellcode:
  XmlDoc := TXMLDocument.Create(frm_main);
  // Alt: XmlDoc := TXMLDocument.Create(nil);
Danke für den Tipp.

sx2008 7. Sep 2012 08:30

AW: Exception beim Zugriff auf ersten XML Knoten
 
<AssemblyInfo> ist dein ROOT-Element.
Also ist dein Code schlichtweg falsch:
Delphi-Quellcode:
// Hier bekomme ich immer eine Exception (Ungültige Zeigeroperation)
// ist ja logisch, denn es gibt kein Childnode mit dem Namen 'AssemblyInfo'
RootNode := XmlDoc.DocumentElement.ChildNodes.Nodes['AssemblyInfo'];
Der Owner von xmlDoc hat damit absolut nix zu tun :wall: :wall:

Lemmy 7. Sep 2012 08:53

AW: Exception beim Zugriff auf ersten XML Knoten
 
Zitat:

Zitat von sx2008 (Beitrag 1181934)
Der Owner von xmlDoc hat damit absolut nix zu tun :wall: :wall:

doch. XMLDocument braucht beim MSXMLDom einen Owner, sonst geht nichts. Dass der Code zur Ermittlung des Knoten falsch ist hat damit nix zu tun, denn selbst ein

Delphi-Quellcode:
  RootNode := oXML.DocumentElement;
führt zu einer Zugriffsverletzung bei Verwendung von NIL als Owner. Und bei dem Zugriff:

Delphi-Quellcode:
  RootNode := XmlDoc.DocumentElement.ChildNodes.Nodes['AssemblyInfo'];
kann es nur dann zu einer Zugriffsverletzung kommen, wenn eines der Objekte in der Reihe nicht definiert ist, nicht aber wenn es den Knoten hinten nicht gibt, dann kommt halt NIL zurück.

Kann einfach mit einem Testprogramm geprüft werden, das spar ich mir hier hochzuladen...

GRüße

P.S.: Habe ich mit Delphi 7 nachgestellt.

Korrektur: Muss was korrigieren: Die Zugriffsverletzung passiert beim Active=true, nicht beim Zugriff auf den Knoten.

Blup 7. Sep 2012 09:20

AW: Exception beim Zugriff auf ersten XML Knoten
 
Einfach mal in der Hilfe nachlesen:
Zitat:

Wenn eine TXMLDocument-Instanz ohne Eigentümer (Owner) erstellt wird, verhält sie sich wie ein Objekt mit Schnittstellenunterstützung. Die Freigabe der Instanz erfolgt dann automatisch, nachdem alle Referenzen auf ihre Schnittstelle freigegeben wurden. Wird ein TXMLDocument-Objekt mit Eigentümer erstellt, ist dieser wie bei jeder anderen Komponente für die Freigabe verantwortlich. Beim Einfügen aus der Komponentenpalette in ein Formular oder Datenmodul wird die TXMLDocument-Komponente automatisch mit Eigentümer erstellt. Wenn die TXMLDocument-Komponente durch einen Aufruf der globalen Funktion LoadXMLDocument (oder einer Funktion, die der Experte für XML-Datenbindungen zum Zurückgeben des Stammknotens eines Dokuments generiert) erstellt wird, werden Instanzen ohne Eigentümer erzeugt.
In diesem Fall genügt es die Deklaration der lokalen Variablen umzustellen:
Delphi-Quellcode:
XmlDoc : IXMLDocument;

Lemmy 7. Sep 2012 09:33

AW: Exception beim Zugriff auf ersten XML Knoten
 
@Blup: Danke für den Hinweis! Ändert aber nichts an der Grundaussage, weil TXMLDocument schlicht einen Owner braucht...

GRüße

DeddyH 7. Sep 2012 10:50

AW: Exception beim Zugriff auf ersten XML Knoten
 
Zitat:

Zitat von little_budda (Beitrag 1181894)
Delphi-Quellcode:
  if (FileExists(xmlFileName) = true) then
  ...
  if (XmlDoc.IsEmptyDoc = false) then

*Bäh*, schreib das besser so:
Delphi-Quellcode:
if FileExists(xmlFileName)
und
Delphi-Quellcode:
if not XmlDoc.IsEmptyDoc

mjustin 7. Sep 2012 12:09

AW: Exception beim Zugriff auf ersten XML Knoten
 
Zitat:

Zitat von Lemmy (Beitrag 1181945)
@Blup: Danke für den Hinweis! Ändert aber nichts an der Grundaussage, weil TXMLDocument schlicht einen Owner braucht...

Wobei der Owner laut Dokumentation auch ein "nil" sein darf. Wie es aber dazu kommt, dass der Absturz davon abhängt ob die Instanz dann an eine Variable des Typs IXmlDocument oder TXmlDocument zugewiesen wird ist eine spannende Frage :)

Lemmy 7. Sep 2012 12:52

AW: Exception beim Zugriff auf ersten XML Knoten
 
Hallo Michael,

wir haben die Ursache dieses Problems (also warum TXMLDOcument einen Owner <>nil braucht) schon mal vor ca. 4-5 Jahren in Suttgart bei der 5S diskutiert, weiß nicht ob Du dich noch dran erinnern kannst :-)

Damals hast Du mir empfohlen einen anderen DOmVendor zu versuchen. Hat damals aber andere Probleme mit sich gebracht und ich bin dabei geblieben beim Create einen Owner anzugeben.

Wobei ich ehrlich gesagt erst nach dem posten meines EIntrags und dem nochmaligen Lesen von Blups Post den Sinn dahinter verstanden habe: @Blup: Nochmal Danke an dich! ist echt ne genial einfache Lösung.

Ich habe versucht das eben zu debuggen, aber da komplett durchzusteigen fehlt mir gerade echt die Zeit. Würde mich freuen wenn mich da jemand erleuchten könnte...

GRüße


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