Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Datei anlegen (https://www.delphipraxis.net/134579-xml-datei-anlegen.html)

Christian18 25. Mai 2009 10:32


XML Datei anlegen
 
Hallo,

ich möchte eine XML Datei auf meiner Festplatte legen. In der Hilfe hatte ich folgendes gefunden.
Delphi-Quellcode:
procedure TElementsShift.SavePositions();
  var Path: String;
      XMLCFG: TXMLDocument;
begin
  Path:=ExtractFilePath(Application.ExeName) + 'CFG\' + FForm.Name + '.cfg';

  XMLCFG:=TXMLDocument.Create(Path);
  try

  finally
    XMLCFG.Free();
  end;
end;
Das funktioniert leider nicht, es kommt der Fehler: Systemfehler -2146697210. Line: 0

Hat jemand ne Idee warum?

MfG Christian18

jaenicke 25. Mai 2009 10:40

Re: XML Datei anlegen
 
Kann es sein, dass die Datei direkt versucht wird zu laden? Denn das wäre für mich der Sinn einer Übergabe im Konstruktor oder was macht das?

Ich benutze das Interface IXmlDocument und habe damit keine Probleme. Ein Auszug aus einem Testprojekt:
Delphi-Quellcode:
var
  Test: IXMLDocument;
  TestNode: IXMLNode;
begin
  Test := NewXMLDocument();
  Test.Options := [doNodeAutoIndent];
  TestNode := Test.AddChild('test');
  TestNode.SetAttributeNS('xyz', 'namesp', 'valuexyz');
  TestNode.AddChild('ddd');
  Test.SaveToFile('test.xml');
Dafür musst du die Unit XmlIntf einbinden.

Christian18 25. Mai 2009 10:44

Re: XML Datei anlegen
 
Hallo,

und wo bekommt man dieses Interface her? Wenn ich dein code bei mir einfüge, sagt die IDE Undefinierter Bezeichner.

jaenicke 25. Mai 2009 10:44

Re: XML Datei anlegen
 
Zitat:

Zitat von jaenicke
Dafür musst du die Unit XmlIntf einbinden.


Christian18 25. Mai 2009 10:50

Re: XML Datei anlegen
 
ok, super funktioniert.

eine kurze frage noch.

diesen header erzeugt dein code:
<?xml version="1.0"?>

ich brauche aber diesen:
<?xml version="1.0" encoding="ISO-8859-1"?>

LG

jaenicke 25. Mai 2009 10:52

Re: XML Datei anlegen
 
Es gibt direkt die Eigenschaft Encoding (wie ich gerade schnell gesehen habe) ;-).
Delphi-Quellcode:
Test.Encoding := 'Whatever';
Das wird es wohl sein.

Christian18 25. Mai 2009 11:00

Re: XML Datei anlegen
 
super danke funktioniert.

himitsu 25. Mai 2009 12:10

Re: XML Datei anlegen
 
ansonsten beim Create den Dateinamen nicht angeben und erst zum Schluß mit .SaveToFile speichern

Delphi-Quellcode:
XMLCFG := TXMLDocument.Create(nil);
XMLCFG.Active    := True;
XMLCFG.Version   := '1.0';
XMLCFG.Encoding  := 'ISO-8859-1';
...
XMLCFG.SaveToFile(Dateiname);
XMLCFG.Free; // Free kann bei Verwendung von IXMLDocument
             // statt TXMLDocument, für XMLCFG, entfallen

jaenicke 25. Mai 2009 12:13

Re: XML Datei anlegen
 
Zitat:

Zitat von himitsu
ansonsten beim Create den Dateinamen nicht angeben

Also ist das so, das hatte ich ja vermutet, dass die Angabe des Dateinamens dort das Laden auslöst. (Wo die Datei ja noch nicht existiert.)

sirius 25. Mai 2009 12:39

Re: XML Datei anlegen
 
Zitat:

Zitat von himitsu
ansonsten beim Create den Dateinamen nicht angeben und erst zum Schluß mit .SaveToFile speichern

Delphi-Quellcode:
XMLCFG := TXMLDocument.Create(nil);
XMLCFG.Active    := True;
XMLCFG.Version   := '1.0';
XMLCFG.Encoding  := 'ISO-8859-1';
...
XMLCFG.SaveToFile(Dateiname);
XMLCFG.Free; // Free kann bei Verwendung von IXMLDocument,
             // statt TXMLDocument, für XMLCFG, entfallen

Und das funktioniert?

himitsu 25. Mai 2009 12:47

Re: XML Datei anlegen
 
Zitat:

Zitat von sirius
Und das funktioniert?

jupp ... anscheinend ... siehe CheckLibs.dpr aus himXML :nerd:
(hab's da nur rauskopiert, das CFG ans XML rangehängt und UTF-8 durch ISO-8859-1 ausgetauscht)

[add]
einen Unterschied gibt es ...
ich hab vorher noch CoInitialize aufgerufen, da ich sonst bei einem nil im Constructor von TXMLDokument selber irgendwann eine Exception erhalte :angel2:

sirius 25. Mai 2009 12:55

Re: XML Datei anlegen
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von sirius
Und das funktioniert?

jupp ... anscheinend ... siehe CheckLibs.dpr aus himXML :nerd:
(hab's da nur rauskopiert, das CFG ans XML rangehängt und UTF-8 durch ISO-8859-1 ausgetauscht)

Und auch mal etwas reingeschrieben in die XML?

himitsu 25. Mai 2009 12:56

Re: XML Datei anlegen
 
jupp ... und es als Datei gespeichert oder geladen ... wie gesagt, siehe Demo in himXML

PS: siehe mein [add] weiter oben ... eventuell ist das ja ein Grund :nerd:


Kurzfassung eines der Testcodes von drüben:
Delphi-Quellcode:
Program CheckLibs;

Uses Windows, SysUtils, ActiveX, XMLDOM, XMLIntf, XMLDoc;

Var i: Integer;
  XML: TXMLDocument;

Begin
  Try
    CoInitialize(nil);

    WriteLn('fill with 100.000 nodes, save into and load this from a file');

    XML := TXMLDocument.Create(nil);
    XML.Active    := True;
    XML.Version   := '1.0';
    XML.StandAlone := 'yes';
    XML.Encoding  := 'UTF-8';
    XML.Options   := [doNodeAutoIndent];
    XML.AddChild('xml');
    For i := 0 to 99999 do XML.DocumentElement.AddChild('Node' + IntToStr(i));
    XML.SaveToFile('Test.xml');
    XML.Free;

    XML := TXMLDocument.Create(nil);
    XML.LoadFromFile('Test.xml');
    XML.Free;
  Except
    On E: Exception do WriteLn(E.Classname, ': ', E.Message);
  End;
  WriteLn('press [enter]');
  ReadLn;
End.

sirius 25. Mai 2009 13:23

Re: XML Datei anlegen
 
Nimm mal die For-Schleife raus!

Edit: CoInitialize ist es nicht. Das ist in diesen Form-Units in irgendeiner automatisch eingebundenen Unit mit dabei

himitsu 25. Mai 2009 13:34

Re: XML Datei anlegen
 
jupp ... hab CoInitialize auch nur für die Consolenanwendung benötigt, da es dort keine Forms-Dingens gibt :stupid:

D2009 ... ich kann's dann gern auch nochmal in TDE und D7 versuchen
(alles einzeln aufgerufen ... je neuer Programmstart)
Delphi-Quellcode:
// keine Exception

XML := TXMLDocument.Create(nil);
XML.Free;

// ---------------------------
// Benachrichtigung über Debugger-Exception
// ---------------------------
// Im Projekt CheckLibs.exe ist eine Exception der Klasse EOleSysError
// mit der Meldung 'CoInitialize wurde nicht aufgerufen' aufgetreten.
// ---------------------------
// Anhalten  Fortsetzen  Hilfe  
// ---------------------------

XML := TXMLDocument.Create(nil);
XML.Active := True; <<<<
XML.Free;

// keine Exception

CoInitialize(nil);
XML := TXMLDocument.Create(nil);
XML.Active := True;
XML.Free;


// keine Exception

CoInitialize(nil);
XML := TXMLDocument.Create(nil);
XML.Active := True;
XML.Version   := '1.0';
XML.StandAlone := 'yes';
XML.Encoding  := 'UTF-8';
XML.Free;

// keine Exception

CoInitialize(nil);
XML := TXMLDocument.Create(nil);
XML.Active := True;
XML.Version   := '1.0';
XML.StandAlone := 'yes';
XML.Encoding  := 'UTF-8';
XML.AddChild('xml');
XML.Free;

// und ebenfalls keine Exception

CoInitialize(nil);
XML := TXMLDocument.Create(nil);
XML.Active := True;
XML.Version   := '1.0';
XML.StandAlone := 'yes';
XML.Encoding  := 'UTF-8';
XML.AddChild('xml');
For i := 0 to 9999 do XML.DocumentElement.AddChild(...);
XML.Free;

sirius 25. Mai 2009 13:37

Re: XML Datei anlegen
 
Dann hat man den "Bug" wohl in neueren Versionen behoben.

himitsu 25. Mai 2009 13:59

Re: XML Datei anlegen
 
in TDE Update 2 konnte ich so diesen Fehler auch nicht ausfindig machen.


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