Die eigentliche Frage
Zitat:
Was kann ich tun, um trotzdem CarriageReturn/Linefeeds und Spaces in meiner Ausgabe zu erhalten, ohne das die
Geschwindigkeit wieder zusammenbricht?
kann ich leider auch nicht beantworten. Ich finde diese Erscheinung auch erstmal erstaunlich. Ist die Compiler-Option "String-Formatprüfung" eingeschaltet? Wie ist es, wenn Du nur "Idnt: '';" setzt, aber CrLF=#13#10 lässt? Mir fällt eigentlich nur auf, dass der Compiler bei der Sequenz:
Result := Expand(Result + CrLf, Indent + Idnt, Elements[i].Elements) + Indent;
mit CrLf='' und Idnt='' keine temporären Strings für "Result + CrLf" und "Indent + Idnt" erstellen muss. Da auch Indent dann leer bleibt, reduziert sich der Aufruf dann in der Konsequenz auf
Result := Expand(Result, '', Elements[i].Elements));
Hier würde ich vielleicht ansetzten. Ich hoffe, ich habe keinen fürchterlichen Denkfehler gemacht, aber geht es auch so???
Delphi-Quellcode:
procedure Expand(const Indent: string; const Elements: TXmlElements);
var
i: Integer;
Content: string;
SmartEnd: Boolean;
begin
for i := 0 to Elements.Count - 1 do
begin
Result := Result + Indent + '<' + Elements[i].Name;
Content := Trim(Elements[i].Content);
SmartEnd := not((Content <> '') or (Elements[i].Elements.Count > 0));
if not(SmartEnd) then
Result := Result + '>' + Content;
if Elements[i].Elements.Count > 0 then
begin
Result := Result + CrLf;
Expand(Indent + Idnt, Elements[i].Elements) + Indent;
end;
if not(SmartEnd) then
Result := Result + '</' + Elements[i].Name + '>'
else
Result := Result + '/>';
Result := Result + CrLf;
end;
end;
Falls ich mir das korrekt überlegt haben sollte, würde man ziemlich oft das Kopieren des Result-Strings vermeiden.