Hier klöppelt aber niemand manuell Strings zusammen, die sowas wie ein
XML ergeben sollen,
oder wird hier doch eine
XML-Komponente genutzt, und wenn ja, warum behandelt oder kodiert die sowas nicht?
Naja, "behandelt" wird das ja vom
MSXML-Framework schon (mehr oder weniger). Das nennt sich Validation und führt zu ein
Exception wenn so ein String einer Node zugewiesen wird.
Soweit ich das bisher herausgefunden habe gibt es dafür keine mitgelieferte Funktion, also führt dann wohl nichts um eine eigne Sanitize-Funktion herum.
Laut
XML Spezifikation sollte das dann in RegEx etwa so aussehen [^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD] (was in Delphi natürlich nicht umsetzbar ist).
Daher habe ich mich für eine TStringBuilder - Lösung entschieden:
Delphi-Quellcode:
function SanitizeXML(const AValue: String): String;
var
i: Integer;
LChr: Char;
LStrBldr: TStringBuilder;
begin
LStrBldr := TStringBuilder.Create;
try
for i := 1 to Length(AValue) do
begin
LChr := AValue[i];
if (LChr = #9) or (LChr = #10) or (LChr = #13) or
((LChr >= #32) and (LChr <= #$D7FF)) or
((LChr >= #$E000) and (LChr <= #$FFFD)) then
LStrBldr.Append(LChr);
end;
Result := LStrBldr.ToString;
finally
LStrBldr.Free;
end;
end;
Da ich damals das
XML-Handling in einer eigenen
XML-File Klasse verpackt habe, um einfach verschiedene
XML-Libs zu testen, gibt es ohnehin nur zwei Stellen an denen eine Node.Value oder .Attribute zugewiesen wird und damit bin ich dann hoffentlich auf der sicheren Seite.
Gibt es dagegen bedenken oder etwas das noch schneller ist?