Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.227 Beiträge
 
Delphi 12 Athens
 
#4

Re: XML Problem beim Einlesen

  Alt 4. Okt 2009, 10:24
Wegen des doNodeAutoCreate: Ich hatte irgendwie im Hinterkopf, daß in TXMLDocument dieses per Standard nicht gesetzt ist, aber wie ich grad sehe, ist dieses doch der Fall (kann aber auch sein, daß anderer Arten der Erzeugung eines Dokuments da andere Voreinstellungen haben )

Nja, jedenfalls gäbe es ohne diese Option eine Exception, da du ungeprüft auf applicant_1 bis applicant_5 zugreifst, es aber nur die applicant_1 in dem Dokument gibt.



Sooo, also theoretisch würde/könnte man bei TXMLDocument so eine Datei erstellen
Delphi-Quellcode:
XMLDocument1.Active := True;
XMLDocument1.Version := '1.0';
XMLDocument1.StandAlone := 'yes';
XMLDocument1.Encoding := 'UTF-8';
XMLDocument1.Options := [doNodeAutoIndent];
XMLDocument1.AddChild('WRT');
XMLDocument1.SaveToFile('d:\Test.xml');
Und ich hätte dieses auch so in die Exceptionbehandlung aufgenommen.

PS: LoadFromFile lößt die Exception schon aus und würde nach erfolgreichem Parsen .Active auf True setzen.
Demnach wäre ein Exprizites .Active:=True, nach erfolgreichem Parsen garnicht nötig.

.Active := True; müßte man dan aber machen, wenn man das Dokument nun nach der Exception (neu) erstellen will, da die nachfolgenden Befehle nur in einem aktiven Element richtig ausgeführt werden.

Das Fazit wäre also
Delphi-Quellcode:
var i: integer;
  app: IXMLNode;
begin
  try
    XMLDocument1.LoadFromFile('d:\texst.xml');
  except
    on E: EDOMParseError do
    begin
      XMLDocument1.Active := True;
      XMLDocument1.Version := '1.0';
      XMLDocument1.StandAlone := 'yes';
      XMLDocument1.Encoding := 'UTF-8';
      XMLDocument1.Options := [doNodeAutoIndent];
      XMLDocument1.AddChild('WRT');
      XMLDocument1.SaveToFile('d:\texst.xml');
    end;
  end;
Leider geht das aber nicht, wenn zuvor eine Exception in dieser Klasse aufgetreten ist, weil da anscheinend immernoch noch der defekte, bzw. leere XML-Text im Dokument drinsteckt und das Aktivieren + nochmal Parsen nun die Exception erneut aufrufen würde.
Leider find ich aber keinen Weg TXMLDocument irgendwie zurückzusetzen (sowas wie .Clear z.B. )


Gut, eine Lösung wäre nun einfach ein korrektes Dokument direkt reinzuladen.
z.B.:
Delphi-Quellcode:
var i: integer;
  app: IXMLNode;
begin
  try
    XMLDocument1.LoadFromFile('d:\texst.xml');
  except
    on E: EDOMParseError do
    begin
      XMLDocument1.LoadFromXML('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><WRT/>');
      XMLDocument1.SaveToFile('d:\texst.xml');
    end;
  end;
Wenn jetzt noch weitere Subnodes direkt rein sollen, dann könnte man diese jetzt mit in diesen XML-Text einfügen oder sie danach z.B. via .AddChild hinzuzufügen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat