Nunja, ich denke mal es ist schneller als Dieses:
Delphi-Quellcode:
function TNXXmlDocument.Content: UTF8String;
var
ElementList: TStringList;
{ ExpandElements }
procedure ExpandElements(
const Indent:
string; Elements: TNXXmlElements);
var
Str, Str2:
String;
i, j: Integer;
begin
for i := 0
to Elements.Count - 1
do
begin
Str := Indent + '
<' + Trim(Elements[i].
Name):
for j := 0
to Elements[i].Attributes.Count - 1
do
Str := Str + Elements[i].Attributes[j].
Name + '
="' + Elements[i].Attributes[j].Value + '
"';
if Elements[i].Elements.Count > 0
then
begin
ElementList.Add(Str + '
>');
ExpandElements(Indent + '
', Elements[i].Elements);
ElementList.Add(Indent + '
</' + Elements[i].
Name + '
>');
end
else
begin
Str2 := Trim(Elements[i].Content);
if Str2 <> '
'
then
ElementList.Add(Str + '
>' + Str2 + '
</' + Elements[i].
Name + '
>')
else
ElementList.Add(Str + '
/>');
end
end;
end;
begin
ElementList := TStringList.Create;
try
ElementList.Add('
<?xml version="1.0" encoding="utf-8" ?>');
ExpandElements('
', Elements);
Result := UTF8Encode(ElementList.Text);
finally
ElementList.Free;
end;
end;
Aber sooo viele Attribute sollte es nicht geben (jedenfalls nicht innerhalb eines Nodes), daß die hier erzeugten "langsameren" Stringoperationen am Ende sehr viel ausmachen.
Aber im Endefekt sollte es so "hübscher" ... ähhhhhh übersichtlicher sein.
Problen waren ja vorallem die Unmassen an "großen" Strings, welche ständig umkopiert wurden ... wenige Kleine fallen meißt nicht so sehr ins Gewicht und auf die eine oder andere Millisekunde kommt es doch wohl nun wirklich nicht an.
Die ganzen .Content, .Name und .Value sollten als
Unicode vorliegen oder notfalls via UTF8ToString in einen umgewandelt werden, bevor sie eingefügt werden, denn die StringList ist ja nur
Unicode.
Alternativ, wenn alles schon als
Unicode Vorliegt, dann die AnsiStringList aus der
Unit AnsiStrings verwenden und alles gleich so behandeln, als wäre es UTF8.