![]() |
Problem mit XML Datei
Hi!
Ich bastle grad mal wieder einwenig rum und hab nun ein Problem mit dem schreiben in meine XML Datei. Da ich schon n Prog hab, in dem ich dat verwende, hab ich auch den Code daraus genommen :mrgreen: un noch einwenig angepasst. Ja nur kommt nun ne Zugriffsverletzung... :wall:
Delphi-Quellcode:
Kann mir vielleicht ein DPler den Fehler nennen!? - Hatte schon probiert aber mit XML hab ichs noch nich so :mrgreen:
uses ... MSXML2_TLB; //XML 4 ist auch installiert
type ... public { Public-Deklarationen } instpath: string; xmlDoc: IXMLDOMDocument2; end; ... const xmlfilename='Data/buddys.xml'; ... procedure Tfrm_new.bn_speichernClick(Sender: TObject); var newBuddy, newSub: IXMLDOMNode; begin if (ed_name.Text='') or (ed_vorname.Text='') then begin ShowMessage('Name bzw. Vorname wurde nicht ausgefüllt - Eingabe benötigt!'); end else begin xmlDoc:=frm_main.xmlDoc; newBuddy := xmldoc.createElement('Buddy'); newSub := xmldoc.createElement('BuddyID'); newSub.text := ed_buddyid.Text; newBuddy.appendChild(newSub); newSub := xmlDoc.createElement('Name'); newSub.text := ed_name.Text; newBuddy.appendChild(newSub); newSub := xmlDoc.createElement('Vorname'); newSub.text :=ed_vorname.Text; newBuddy.appendChild(newSub); ... newSub := xmlDoc.createElement('Sonstiges'); newSub.text := mem_sonstiges.Text; newBuddy.appendChild(newSub); newSub := xmlDoc.createElement('Bild'); newSub.text := ed_picname.Text; newBuddy.appendChild(newSub); xmlDoc.documentElement.appendChild(newBuddy); //Hier bekomm ich die Zugriffsverletzung xmlDoc.save(frm_main.instpath + xmlfilename); ClearEdits; frm_new.Close; end; end; THX & Greetz, |
Re: Problem mit XML Datei
Das Beispiel ist an sich korrekt. Eine Zugriffsverletzung erhältst du nur, wenn das benutzte XML-Dokument noch leer ist. Das solltest du vielleicht mal prüfen.
Oder anders gesagt: was passiert in deinem Programm, wenn die XML-Datei noch nicht existiert? Wird es dann beendet, oder startet es trotzdem? Im zweiten Fall solltest du schauen, ob du dem Dokument die Grundstruktur übergibst, bspw:
Code:
oder was immer dein Hauptknoten ist. Dann dürfte es keinen Fehler mehr geben.
xmldoc.loadXML('<buddies/>');
|
Re: Problem mit XML Datei
Na momentan ist meine XML Datei noch leer- will ja mit dieser Prozedur in sie schreiben. Sie ist auch vorhanden. Ich frage im OnCreate des Hauptformulars ab, ob die Datei existiert, wenn nicht, dann soll er sie anlegen. Weiß da jetzt nich mehr weiter was ich noch machen soll.
|
Re: Problem mit XML Datei
Wie: du weißt nicht weiter? Ich habe dir doch gesagt, was du tun musst. Wenn die Datei nicht existiert, dann hilft es auch nicht, sie anzulegen (physisch auf der Platte) - das XML-Dokument (xmlDoc) im Programm ist trotzdem noch leer. Du musst also den Basis-XML-Code reinschreiben. Ich habe allerdings keine Ahnung, wie deine Datei aufgebaut ist, darum ja von mir nur der Vorschlag mit
Delphi-Quellcode:
Und: was so einfach geht, geht auch ausführlicher:
xmlDoc.loadXML('<buddies/>');
Delphi-Quellcode:
Was du eben so brauchst ...
xmlDoc.loadXML('<?xml version="1.0"?><buddies/>');
Wenn ich das mache, erhalte ich keine Zugriffsverletzung. |
Re: Problem mit XML Datei
Soll ich das dann hier unterbringen??
Delphi-Quellcode:
Sorry, muss mich erst noch mehr in XML reinhängen. :roll:
..
xmlDoc.loadXML('<?xml version="1.0"?><buddies/>'); xmlDoc.documentElement.appendChild(newBuddy); xmlDoc.save(frm_main.instpath + xmlfilename); ... |
Re: Problem mit XML Datei
Also wenn ich mir den XML Code meiner anderen Anwendung anschaue und ihn dann auf meine Anwendung umstellen würde, würd ich es mir so vorstellen.
XML-Code:
Aber eigentlich mach ich doch nu auch nix anderes in dieser Anwendung als in der Anderen wenn ich speichern will, wie gesagt, habe den benötigten Code kopiert und umgestellt. :gruebel:
<?xml version="1.0" encoding="iso-8859-1"?>
<BuddLister> <Buddy> <BuddyID>1</BuddyID> <Name>Schmit</Name> <Vorname>Achim</Vorname> ... </Buddy> </BuddyLister> |
Re: Problem mit XML Datei
Also, du hast in deinem Hauptformular irgendwo "xmlDoc" deklariert, das sehe ich an dieser Zeile:
Delphi-Quellcode:
Und im "OnCreate" dieser Form (frm_main) wirst du schätzungsweise versuchen, die XML-Datei zu laden bzw. zu suchen, bspw. so:
xmlDoc:=frm_main.xmlDoc;
Delphi-Quellcode:
Der Sinn ist jetzt, im Fall eines Fehlers (Datei existiert nicht), das Dokument zu erzeugen
if(fileexists('blabla.xml')) then
xmldoc.load('blabla.xml')
Delphi-Quellcode:
Du kannst nach dem Laden einer existierenden Datei auch auf Nummer sicher gehen mit:
else
xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');
Delphi-Quellcode:
Falls also irgendwer die XML-Datei manipuliert und den Namen des Root-Knotens geändert hat, wird das so erkannt, und du erstellst das Dokument auch wieder neu. Damit gehen aber evtl. vorhandene "Buddy"-Knoten verloren. Wobei sich dieses Problem natürlich auch lösen lässt.
if(xmldoc.documentElement.Get_NodeName <> 'BuddLister') then
xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>'); So habe ich mir das vorgestellt, und wenn du das mal probierst, dann solltest du auch keine Fehlermeldung bekommen. Wichtig an der ganzen Geschichte war einfach nur, dass es nicht ausreicht, eine leere XML-Datei zu erzeugen. Damit ist das XML-Dokument im Programm (xmlDoc) trotzdem noch leer. Es gibt keinen Root-Knoten (xmldoc.documentElement), und dadurch kam es zur Zugriffsverletzung, weil du versucht hast, den erstellten Knoten an einen nicht existierenden Root-Knoten anzuhängen. |
Re: Problem mit XML Datei
Hui :corky: - Dat war echt perfekt erklärt, werd mich dran versuchen. :coder: THX
|
Re: Problem mit XML Datei
:wiejetzt: Also entweder schlägt mir meine kleene Angina zu sehr offn Kopp, dat ichs nich hinkrieg aber es will immernoch nich. Habs jetzt wie du meintest ins OnCreate des Hauptform geschrieben. Jetzt kommts da zuner Zugriffsverletzung..
Delphi-Quellcode:
:wall: :gruebel: :wall:
unit main;
interface uses .. MSXML2_TLB; type Tfrm_main = class(TForm) ... public { Public-Deklarationen } instpath: string; xmlDoc: IXMLDOMDocument2; end; const xmlfilename='Data/buddys.xml'; procedure Tfrm_main.FormCreate(Sender: TObject); begin instpath:=ExtractFilePath(Application.ExeName); if not FileExists(xmlfilename) then FileCreate(xmlfilename); if FileExists(xmlfilename) then xmlDoc.load(xmlfilename) // Hier gibts diesma die Zugriffsverletzung else xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>'); xmlDoc := CoDOMDocument40.Create; xmlDoc.setProperty('NewParser', true); end; |
Re: Problem mit XML Datei
Na, das ist doch wohl logisch.
Code:
Bevor du das XML-Dokument erzeugst, schreibst du Code rein? Denk mal darüber nach ;)
[color=#ff0000]else xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');[/color]
xmlDoc := CoDOMDocument40.Create; xmlDoc.setProperty('NewParser', true); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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 by Thomas Breitkreuz