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.