Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Problem mit XML Datei (https://www.delphipraxis.net/10954-problem-mit-xml-datei.html)

Akut-Programming 28. Okt 2003 17:09


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:
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;
Kann mir vielleicht ein DPler den Fehler nennen!? - Hatte schon probiert aber mit XML hab ichs noch nich so :mrgreen:

THX & Greetz,

MathiasSimmack 29. Okt 2003 11:18

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:
xmldoc.loadXML('<buddies/>');
oder was immer dein Hauptknoten ist. Dann dürfte es keinen Fehler mehr geben.

Akut-Programming 29. Okt 2003 12:47

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.

MathiasSimmack 29. Okt 2003 13:18

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:
xmlDoc.loadXML('<buddies/>');
Und: was so einfach geht, geht auch ausführlicher:
Delphi-Quellcode:
xmlDoc.loadXML('<?xml version="1.0"?><buddies/>');
Was du eben so brauchst ...

Wenn ich das mache, erhalte ich keine Zugriffsverletzung.

Akut-Programming 29. Okt 2003 15:32

Re: Problem mit XML Datei
 
Soll ich das dann hier unterbringen??

Delphi-Quellcode:
..
xmlDoc.loadXML('<?xml version="1.0"?><buddies/>');
xmlDoc.documentElement.appendChild(newBuddy);
xmlDoc.save(frm_main.instpath + xmlfilename);

...
Sorry, muss mich erst noch mehr in XML reinhängen. :roll:

Akut-Programming 29. Okt 2003 16:17

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:
<?xml version="1.0" encoding="iso-8859-1"?>
<BuddLister>
   <Buddy>
      <BuddyID>1</BuddyID>
      <Name>Schmit</Name>
      <Vorname>Achim</Vorname>
      ...
   </Buddy>
</BuddyLister>
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:

MathiasSimmack 29. Okt 2003 16:42

Re: Problem mit XML Datei
 
Also, du hast in deinem Hauptformular irgendwo "xmlDoc" deklariert, das sehe ich an dieser Zeile:
Delphi-Quellcode:
xmlDoc:=frm_main.xmlDoc;
Und im "OnCreate" dieser Form (frm_main) wirst du schätzungsweise versuchen, die XML-Datei zu laden bzw. zu suchen, bspw. so:
Delphi-Quellcode:
if(fileexists('blabla.xml')) then
  xmldoc.load('blabla.xml')
Der Sinn ist jetzt, im Fall eines Fehlers (Datei existiert nicht), das Dokument zu erzeugen
Delphi-Quellcode:
else
  xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');
Du kannst nach dem Laden einer existierenden Datei auch auf Nummer sicher gehen mit:
Delphi-Quellcode:
if(xmldoc.documentElement.Get_NodeName <> 'BuddLister') then
  xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');
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.

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.

Akut-Programming 29. Okt 2003 17:01

Re: Problem mit XML Datei
 
Hui :corky: - Dat war echt perfekt erklärt, werd mich dran versuchen. :coder: THX

Akut-Programming 29. Okt 2003 17:17

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:
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;
:wall: :gruebel: :wall:

MathiasSimmack 29. Okt 2003 17:23

Re: Problem mit XML Datei
 
Na, das ist doch wohl logisch.
Code:
[color=#ff0000]else xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');[/color]
xmlDoc := CoDOMDocument40.Create;
xmlDoc.setProperty('NewParser', true);
Bevor du das XML-Dokument erzeugst, schreibst du Code rein? Denk mal darüber nach ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.
Seite 1 von 2  1 2      

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