Delphi-PRAXiS

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 ;)

Akut-Programming 29. Okt 2003 17:54

Re: Problem mit XML Datei
 
Ich gebs gleich auf... :wall: :wall: :wall: :wall: :wall: - Umgestellt -> Neue Zugriffsverletzung:
Delphi-Quellcode:
procedure Tfrm_main.FormCreate(Sender: TObject);
begin
  instpath:=ExtractFilePath(Application.ExeName);
  if not FileExists(xmlfilename) then FileCreate(xmlfilename);
  if FileExists(xmlfilename)
  then begin
    xmlDoc.load(xmlfilename)                 // Nu kommtse hier
    xmlDoc := CoDOMDocument40.Create;
    xmlDoc.setProperty('NewParser', true);
  end else xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');
end;

MathiasSimmack 29. Okt 2003 21:34

Re: Problem mit XML Datei
 
Du hast überhaupt nichts umgestellt. Es ist der gleiche Fehler. Noch ein letztes Mal zum Mitdenken, dann geb´ ich auf -

Du versuchst die Datei in das XML-Objekt "xmlDoc" zu laden,
Code:
[color=#ff0000]xmlDoc.load(xmlfilename)[/color]
aber erst danach erzeugst du es:
Delphi-Quellcode:
xmlDoc := CoDOMDocument40.Create;
xmlDoc.setProperty('NewParser', true);
:?
Meinst du wirklich, dass das so funktioniert?

Und selbst wenn du´s nun richtig herum machst, riskierst du den nächsten Fehler. Wenn die Datei nämlich nicht existiert, dann versuchst du XML-Code in ein nicht erzeugtes XML-Objekt zu schreiben:
Delphi-Quellcode:
if FileExists(xmlfilename)
then begin
  xmlDoc := CoDOMDocument40.Create;
end
// Datei existiert nicht!
else xmldoc.loadXML('<?xml version="1.0" encoding="iso-8859-1"?><BuddLister/>');
Bitte denk doch mal ein bisschen logisch.
Die Reihenfolge:
  1. XML-Objekt "xmlDoc" erzeugen
  2. prüfen, ob die Datei existiert
    1. wenn Ja, Datei laden
    2. wenn Nein, XML-Grundcode in das Objekt schreiben
  3. zur Sicherheit den geladenen XML-Code prüfen (zumindest den Namen des Root-Knotens)
  4. Wenn alles OK war, weiter im Programm ... im wahrsten Sinn des Wortes
Gruß.


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