diff --git a/UnitTests/Units/XMLDataBindingUtilsTest.pas b/UnitTests/Units/XMLDataBindingUtilsTest.pas
new file mode 100644
index 0000000..4654277
--- /dev/null
+++ b/UnitTests/Units/XMLDataBindingUtilsTest.pas
@@ -0,0 +1,39 @@
+unit XMLDataBindingUtilsTest;
+
+interface
+uses
+ TestFramework;
+
+
+type
+ TXMLDataBindingUtilsTest = class(TTestCase)
+ published
+ procedure TestIsValidXMLChar;
+ procedure TestGetValidXMLText;
+ end;
+
+
+implementation
+uses
+ XMLDataBindingUtils;
+
+
+{ TXMLDataBindingUtilsTest }
+procedure TXMLDataBindingUtilsTest.TestIsValidXMLChar;
+begin
+ CheckTrue(IsValidXMLChar('A'));
+ CheckTrue(IsValidXMLChar('ë'));
+ CheckFalse(IsValidXMLChar(#$1A));
+end;
+
+
+procedure TXMLDataBindingUtilsTest.TestGetValidXMLText;
+begin
+ CheckEquals('AB', GetValidXMLText('AB'));
+end;
+
+
+initialization
+ RegisterTest(TXMLDataBindingUtilsTest.Suite);
+
+end.
diff --git a/UnitTests/X2UtUnitTests.dpr b/UnitTests/X2UtUnitTests.dpr
index 81e715c..93b4fbf 100644
--- a/UnitTests/X2UtUnitTests.dpr
+++ b/UnitTests/X2UtUnitTests.dpr
@@ -11,7 +11,9 @@ uses
X2UtHashes in '..\X2UtHashes.pas',
X2UtHashesVariants in '..\X2UtHashesVariants.pas',
NamedFormatTest in 'Units\NamedFormatTest.pas',
- StringsTest in 'Units\StringsTest.pas';
+ StringsTest in 'Units\StringsTest.pas',
+ XMLDataBindingUtilsTest in 'Units\XMLDataBindingUtilsTest.pas',
+ XMLDataBindingUtils in '..\XMLDataBindingUtils.pas';
//SettingsTest in 'Units\SettingsTest.pas',
//IniParserTest in 'Units\IniParserTest.pas';
diff --git a/UnitTests/X2UtUnitTests.dproj b/UnitTests/X2UtUnitTests.dproj
index f394162..0843410 100644
--- a/UnitTests/X2UtUnitTests.dproj
+++ b/UnitTests/X2UtUnitTests.dproj
@@ -31,6 +31,12 @@
Base
true
+
+ true
+ Cfg_2
+ true
+ true
+
System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)
CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
@@ -38,7 +44,7 @@
ip-to-country.csv countries.csv geo.db
- Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
+ System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
1033
CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=
@@ -73,6 +79,11 @@
False
False
+
+ Vcl;$(DCC_Namespace)
+ None
+ 1033
+
Delphi.Personality.12
VCLApplication
@@ -136,6 +147,8 @@
+
+
Cfg_2
Base
diff --git a/XMLDataBindingUtils.pas b/XMLDataBindingUtils.pas
index 186293b..ea25b5d 100644
--- a/XMLDataBindingUtils.pas
+++ b/XMLDataBindingUtils.pas
@@ -1,9 +1,5 @@
{
Helpers functions for the X2Software XML Data Binding
-
- Last changed: $Date: 2010-07-15 12:57:03 +0200 (do, 15 jul 2010) $
- Revision: $Rev: 54 $
- URL: $URL: http://svn.kamadev.net/private/XMLDataBinding/trunk/Shared/XMLDataBindingUtils.pas $
}
unit XMLDataBindingUtils;
@@ -83,6 +79,8 @@ const
procedure CreateRequiredAttributes(AParent: IXMLNode; ANodes: array of string);
procedure SortChildNodes(AParent: IXMLNode; ASortOrder: array of string);
+ function IsValidXMLChar(AChar: WideChar): Boolean;
+ function GetValidXMLText(AText: WideString): WideString;
{ Now wraps the JclMime implementation:
Lightening fast Mime (Base64) Encoding and Decoding routines.
@@ -583,6 +581,37 @@ begin
end;
+function IsValidXMLChar(AChar: WideChar): Boolean;
+begin
+ Result := (Ord(AChar) in [9, 10, 13]) or
+ (Ord(AChar) >= 32);
+end;
+
+
+function GetValidXMLText(AText: WideString): WideString;
+var
+ validText: WideString;
+ sourcePos: Integer;
+ destPos: Integer;
+
+begin
+ SetLength(validText, Length(AText));
+ destPos := 0;
+
+ for sourcePos := 1 to Length(AText) do
+ begin
+ if IsValidXMLChar(AText[sourcePos]) then
+ begin
+ Inc(destPos);
+ validText[destPos] := AText[sourcePos];
+ end;
+ end;
+
+ SetLength(validText, destPos);
+ Result := validText;
+end;
+
+
{ --- JclMime implementation from here. }
type
{$IFDEF WIN64}