Einzelnen Beitrag anzeigen

Benutzerbild von ---Bernhard---
---Bernhard---

Registriert seit: 26. Dez 2003
Ort: Abensberg
111 Beiträge
 
Delphi 2006 Professional
 
#1

Problem beim Schreiben/Lesen mit "doNodeAutoIdent"

  Alt 26. Feb 2007, 19:54
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
Angehängte Dateien
Dateityp: zip xml-problem_188.zip (273,8 KB, 2x aufgerufen)
Bernhard Doll
Das Leben ist ein sch*** Spiel... aber eine super Grafik!!
http://www.doll-online.net
  Mit Zitat antworten Zitat