Das Problem ist, dass Sie die gesamte Zeichenkettengröße zweimal iterieren (einmal zum Ersetzen von > durch > und einmal zum Ersetzen von < durch <).
Sie sollten mit einem for iterieren und einfach immer dann, wenn Sie ein & finden, nach einem gt; oder lt; suchen und die sofortige Ersetzung vornehmen und dann 3 Zeichen überspringen ((g|l)t;). Auf diese Weise kann dies in einer Zeit geschehen, die proportional zur Größe der Zeichenkette ist. xml.Text .
Ein einfaches C#-Beispiel, da ich mich nicht mit Delphi auskenne, sollte aber genügen, um die allgemeine Idee zu verstehen.
String s = "<xml>test</xml>";
char[] input = s.ToCharArray();
char[] res = new char[s.Length];
int j = 0;
for (int i = 0, count = input.Length; i < count; ++i)
{
if (input[i] == '&')
{
if (i < count - 3)
{
if (input[i + 1] == 'l' || input[i + 1] == 'g')
{
if (input[i + 2] == 't' && input[i + 3] == ';')
{
res[j++] = input[i + 1] == 'l' ? '<' : '>';
i += 3;
continue;
}
}
}
}
res[j++] = input[i];
}
Console.WriteLine(new string(res, 0, j));
Diese Ausgaben:
<xml>test</xml>