Hallo!
Versuche mich derzeit in
XML einzuarbeiten. Die ersten Tests klappten bisher auch ganz gut. Ich verwende die Komponente TXMLDocument, die bei Delphi standardmäßig mit dabei ist.
Leider war die Ausgabe-
XML-Datei nicht formatiert, darum habe ich "doNodeAutoIdent" auf true gesetz. Jedoch habe ich nun Probleme mit dem Auslesen der
XML Datei, nachdem(!) ich etwas hineingeschrieben habe. Speicher ich die
XML-Datei und lade sie nochmal neu, dann klappt es wieder ohne Probleme.
Meine Vorgehensweise kurz erläutert:
In meiner
XML Datei befinden sich beliebig viele Nodes mit dem Namen "<person>". Diese sind in weitere einzelne Punkte Unterteilt, in dem Demoprojekt nur "vorname".
In meinem Programm lass ich die Vornamen in einer Listbox anzeigen, indem ich mit einer for-Schleife alle Einträge druchgehe.
Das klappt auch ganz Problemlos.
Wenn ich einen Eintrag hinzufüge (doNodeAutoIdent=
false) und danach wieder einlesen möchte klappt diese ohne Probleme.
Sobald doNodeAutoIdent=
true ist, wird beim darauffolgendem Auslesen ein FEhler ausgegeben:
Zitat:
---------------------------
Project1
---------------------------
This operation can not be performed with a Node of type PCDATA.
---------------------------
OK
---------------------------
Hier mein Quellcode:
Delphi-Quellcode:
[...]
var
Form1: TForm1;
savepath: String;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//EINTRAG HINZUFÜGEN
XMLDocument1.DocumentElement.AddChild('person').AddChild('vorname').Text:= edit1.Text;
Showmessage('Eintrag hinzugefügt, jetzt auf "LESEN" klicken');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i: Integer;
begin
//EINLESEN
memo1.Lines:= XMLDocument1.XML;
Listbox1.Items.BeginUpdate;
try
Listbox1.Clear;
for i := 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do
Listbox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[i].ChildNodes['vorname'].Text);
finally
Listbox1.Items.EndUpdate;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
XMLDocument1.SaveToFile(savepath);
except
Showmessage('Fehler beim Speichern!');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
savepath:= ExtractFilePath(ParamStr(0)) + 'test_db.xml';
if fileexists(savepath) then
XMLDocument1.LoadFromFile(savepath)
else
begin
XMLDocument1.Create(savepath);
end;
XMLDocument1.Active:= true;
end;
end.
Wenn ich vor dem Einlesen "XMLDocument1.Active:= false; XMLDocument1.Active:= true;" schreibe, tritt der Fehler nicht mehr auf.
Dieses "Workaround" gefällt mir aber nicht besonders und suche deshalb nach einer anständigen Lösung.
Hoffe ihr könnt mir helfen.
Bernhard