RO : An invalid character was found in the text content

I changed unit uROMSXMLImpl. please check source please.
any performance issue in my code?

before:

procedure TROMSXMLNode.SetValue(const Value: Variant);
var
  s: UnicodeString;
begin
  s := VarToWideStrDef(Value, '');
  if isCDATA(s) then
    fNode.appendChild(fNode.ownerDocument.createCDATASection(ExtractCDATA(s)))
  else
    fNode.text := s;
end;

after:

procedure TROMSXMLNode.SetValue(const Value: Variant);
var
  s: UnicodeString;
  function StripUnwantedChar(Text: string):string;
  var
    NotAllowed: Set of Char;
    i, LeftOvers: Integer;
  begin
    NotAllowed := [#$1..#$8,#$E..#$1F,#$7F..#$84,#$86..#$9F];
    SetLength(Result, Length(Text));
    LeftOvers := 1;
    for i := 1 to Length(Text) do begin
      if not (Text[i] in NotAllowed) then begin
        Result[LeftOvers]:= Text[i];
        Inc(LeftOvers);
      end
    end;
    SetLength(Result, LeftOvers-1);
  end;
begin
  s := VarToWideStrDef(Value, '');
  if isCDATA(s) then
    fNode.appendChild(fNode.ownerDocument.createCDATASection(ExtractCDATA(s)))
  else
    fNode.text := StripUnwantedChar(s);
end;

Hi,

Your code is correct. You also may replace invalid chars with dot or space.


according to Extensible Markup Language (XML) 1.1 (Second Edition), you can add also #$B and #$C chars:

[#x1-#x8], [#xB-#xC], [#xE-#x1F], [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].