Ok, I took your example and created a (I suppose) complete encode-decode unit.
Daniele ********************************************************************************************* unit XmlParserUnit; interface uses StrUtils, SysUtils; const XmlNames : Array[1..240] of String = ('"', ''', '&', '<', '>', ' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', '×', '÷', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ', '∀', '∂', '∃', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '−', '∗', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅', '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'ς', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'ϑ', 'ϒ', 'ϖ', 'Œ', 'œ', 'Š', 'š', 'Ÿ', 'ƒ', 'ˆ', '˜', ' ', ' ', ' ', '‌', '‍', '‎', '‏', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '•', '…', '‰', '′', '″', '‹', '›', '‾', '€', '™', '←', '↑', '→', '↓', '↔', '↵', '⌈', '⌉', '⌊', '⌋', '◊', '♠', '♣', '♥', '♦'); XmlValues : Array[1..240] of String = ('"', ''', '&', '<', '>', ' ', '¡', '¢', '£', '¤', '¥', '¦', '§', '¨', '©', 'ª', '«', '¬', '®', '¯', '°', '±', '²', '³', '´', 'µ', '¶', '·', '¸', '¹', 'º', '»', '¼', '½', '¾', '¿', '×', '÷', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'Þ', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'þ', 'ÿ', '∀', '∂', '∃', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '−', '∗', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅', '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', 'Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω', 'α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'ς', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'ϑ', 'ϒ', 'ϖ', 'Œ', 'œ', 'Š', 'š', 'Ÿ', 'ƒ', 'ˆ', '˜', ' ', ' ', ' ', '‌', '‍', '‎', '‏', '–', '—', '‘', '’', '‚', '“', '”', '„', '†', '‡', '•', '…', '‰', '′', '″', '‹', '›', '‾', '€', '™', '←', '↑', '→', '↓', '↔', '↵', '⌈', '⌉', '⌊', '⌋', '◊', '♠', '♣', '♥', '♦'); function EncodeXml(aText: WideString; EncodeNumbers: Boolean = False): String; function DecodeXml(aText: String): String; implementation function EncodeXml(aText: WideString; EncodeNumbers: Boolean = False): String; var CtrlCharIdx, PrevIdx, CurrIdx: Integer; EncodedChar: String; begin PrevIdx := 1; Result := ''; CurrIdx := 1; while CurrIdx <= Length(aText) do begin CtrlCharIdx := AnsiIndexStr('&#' + IntToStr(Ord(aText[CurrIdx])) + ';', XmlValues); if CtrlCharIdx >= 0 then begin if EncodeNumbers then EncodedChar := XmlValues[CtrlCharIdx+1] else EncodedChar := XmlNames[CtrlCharIdx+1]; Result := Result + Copy(aText, PrevIdx, CurrIdx - PrevIdx) + EncodedChar; PrevIdx := CurrIdx + 1; end; Inc(CurrIdx); end; if Result = '' then Result := aText else Result := Result + Copy(aText, PrevIdx, CurrIdx - PrevIdx); end; function DecodeXml(aText: String): String; var SemicolonCharIdx, CtrlCharIdx, PrevIdx, CurrIdx: Integer; EncodingChar, EncodedChar: String; begin PrevIdx := 1; Result := ''; CurrIdx := 1; while CurrIdx <= Length(aText) do begin if aText[CurrIdx]='&' then begin SemicolonCharIdx := PosEx(';', aText, CurrIdx); if SemicolonCharIdx > 0 then begin EncodingChar := Copy(aText, CurrIdx, SemicolonCharIdx - CurrIdx + 1); CtrlCharIdx := AnsiIndexStr(EncodingChar, XmlNames); if CtrlCharIdx=-1 then CtrlCharIdx := AnsiIndexStr(EncodingChar, XmlValues); if CtrlCharIdx >= 0 then begin EncodedChar := WideChar(StrToInt(Copy(XmlValues[CtrlCharIdx+1], 3, Length(XmlValues[CtrlCharIdx+1]) - 3))); Result := Result + Copy(aText, PrevIdx, CurrIdx - PrevIdx) + EncodedChar; PrevIdx := CurrIdx + Length(EncodingChar); end; end; end; Inc(CurrIdx); end; if Result = '' then Result := aText else Result := Result + Copy(aText, PrevIdx, CurrIdx - PrevIdx); end; end. *********************************************************************************************************************** -- To unsubscribe or change your settings for TWSocket mailing list please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be