![]() |
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:
Mein bisheriger Code dazu
<?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>
Delphi-Quellcode:
Ich hoffe es hat jemand eine Idee dazu.
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; :?: |
AW: Exception beim Zugriff auf ersten XML Knoten
Zitat:
Tipp: Rate mal was das DocumentElement (RootNode) ist und wieso man darin keinen (weiteren) Knoten, mit dem Namen "AssemblyInfo" findet. |
AW: Exception beim Zugriff auf ersten XML Knoten
Zitat:
Die Exception kam auch wenn ich nur folgendes aufgerufen habe
Code:
Aber mein Problem ist weg.
RootNode := XmlDoc.DocumentElement;
Lösen lies sich dies durch das Zuweisen des Owners.
Delphi-Quellcode:
Danke für den Tipp.
XmlDoc := TXMLDocument.Create(frm_main);
// Alt: XmlDoc := TXMLDocument.Create(nil); |
AW: Exception beim Zugriff auf ersten XML Knoten
<AssemblyInfo> ist dein ROOT-Element.
Also ist dein Code schlichtweg falsch:
Delphi-Quellcode:
Der Owner von xmlDoc hat damit absolut nix zu tun :wall: :wall:
// 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']; |
AW: Exception beim Zugriff auf ersten XML Knoten
Zitat:
Delphi-Quellcode:
führt zu einer Zugriffsverletzung bei Verwendung von NIL als Owner. Und bei dem Zugriff:
RootNode := oXML.DocumentElement;
Delphi-Quellcode:
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.
RootNode := XmlDoc.DocumentElement.ChildNodes.Nodes['AssemblyInfo'];
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. |
AW: Exception beim Zugriff auf ersten XML Knoten
Einfach mal in der Hilfe nachlesen:
Zitat:
Delphi-Quellcode:
XmlDoc : IXMLDocument;
|
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 |
AW: Exception beim Zugriff auf ersten XML Knoten
Zitat:
Delphi-Quellcode:
und
if FileExists(xmlFileName)
Delphi-Quellcode:
if not XmlDoc.IsEmptyDoc
|
AW: Exception beim Zugriff auf ersten XML Knoten
Zitat:
|
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 04:13 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