using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace XYLEM.Base.XML
{
public static class XMLStringClass
{
public enum XMLVersion
{
V1_0,
V1_1
}
///
/// Strips non-printable ascii characters
/// Refer to http://www.w3.org/TR/xml11/#charsets for XML 1.1
///
///
///
public static string StripIllegalXMLChars(this string txtToClean)
{
return StripIllegalXMLChars(txtToClean, XMLVersion.V1_1);
}
///
/// Strips non-printable ascii characters
/// Refer to http://www.w3.org/TR/xml11/#charsets for XML 1.1
/// Refer to http://www.w3.org/TR/2006/REC-xml-20060816/#charsets for XML 1.0
///
///
///
///
public static string StripIllegalXMLChars(this string txtToClean, XMLVersion version)
{
try
{
string pattern = String.Empty;
txtToClean = txtToClean.
Replace("&", "&").
Replace("<", "<").
Replace(">", ">").
Replace("\"", """).
Replace("'", "'").
Replace("\r", "
").
Replace("\n", "
");
switch (version)
{
case XMLVersion.V1_0:
pattern = @"#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|7F|8[0-46-9A-F]9[0-9A-F])";
break;
case XMLVersion.V1_1:
pattern = @"#x((10?|[2-F])FFF[EF]|FDD[0-9A-F]|[19][0-9A-F]|7F|8[0-46-9A-F]|0?[1-8BCEF])";
break;
}
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
if (regex.IsMatch(txtToClean))
{
txtToClean = regex.Replace(txtToClean, String.Empty);
}
if (txtToClean.Contains('\0'))
{
txtToClean = txtToClean.Remove(txtToClean.IndexOf('\0'));
}
if (txtToClean.Contains((char)0x1E))
{
txtToClean = txtToClean.Replace((char)0x1E, ' ');
}
{
// Replace any character that has survived this done before
// Replace illegal character in XML documents with blank
// See here for reference http://www.w3.org/TR/xml/#charsets
txtToClean = Regex.Replace(txtToClean, "[\x00-\x08\x0B\x0C\x0E-\x1F]", String.Empty, RegexOptions.Compiled);
}
return txtToClean;
}
catch (Exception ex)
{
throw new Exception("Error in XMLFileIOClass and StripIllegalXMLChars() " + (txtToClean != null ? " txtToClean = " + txtToClean.ToString() : "txtToClean is null"), ex);
}
}
///
/// reinset non-printable ascii characters
/// Refer to http://www.w3.org/TR/xml11/#charsets for XML 1.1
///
///
///
public static string ReinsetIllegalXMLChars(this string txtToClean)
{
return ReinsetIllegalXMLChars(txtToClean, XMLVersion.V1_1);
}
///
/// reinset non-printable ascii characters
/// Refer to http://www.w3.org/TR/xml11/#charsets for XML 1.1
/// Refer to http://www.w3.org/TR/2006/REC-xml-20060816/#charsets for XML 1.0
///
///
///
///
public static string ReinsetIllegalXMLChars(string txtToReinset, XMLVersion version)
{
try
{
string pattern = String.Empty;
txtToReinset = txtToReinset.
Replace("&", "&").
Replace("<", "<").
Replace(">", ">").
Replace(""", "\"").
Replace("'", "'").
Replace("
", "\r").
Replace("
", "\n");
return txtToReinset;
}
catch (Exception ex)
{
throw new Exception("Error in XMLFileIOClass and StripIllegalXMLChars() " + (txtToReinset != null ? " txtToClean = " + txtToReinset.ToString() : "txtToClean is null"), ex);
}
}
}
}