AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Exception beim Zugriff auf ersten XML Knoten
Thema durchsuchen
Ansicht
Themen-Optionen

Exception beim Zugriff auf ersten XML Knoten

Ein Thema von little_budda · begonnen am 6. Sep 2012 · letzter Beitrag vom 7. Sep 2012
Antwort Antwort
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#1

Exception beim Zugriff auf ersten XML Knoten

  Alt 6. Sep 2012, 21:02
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.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 6. Sep 2012, 21:53
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?

Tipp: Rate mal was das DocumentElement (RootNode) ist und wieso man darin keinen (weiteren) Knoten, mit dem Namen "AssemblyInfo" findet.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von little_budda
little_budda

Registriert seit: 5. Mai 2006
Ort: Velbert
246 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 09:14
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.
Holger
Glück findet sich nicht im Code
Gefahren werden ist nur solange schön wie man selbst nicht lenken möchte ...
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 09:30
<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
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 09:53
Der Owner von xmlDoc hat damit absolut nix zu tun
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

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

  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.

Geändert von Lemmy ( 7. Sep 2012 um 09:57 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#6

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 10:20
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:
XmlDoc : IXMLDocument;
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 10:33
@Blup: Danke für den Hinweis! Ändert aber nichts an der Grundaussage, weil TXMLDocument schlicht einen Owner braucht...

GRüße
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 11:50
Delphi-Quellcode:
  if (FileExists(xmlFileName) = true) then
  ...
  if (XmlDoc.IsEmptyDoc = false) then
*Bäh*, schreib das besser so:
if FileExists(xmlFileName) und
if not XmlDoc.IsEmptyDoc
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
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 13:09
@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
Michael Justin
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Exception beim Zugriff auf ersten XML Knoten

  Alt 7. Sep 2012, 13:52
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:09 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