C# 从字符串EOT逗号ETX中删除控制字符序列
我有一些xml文件,其中一些控制序列包含在文本中:EOT,ETX(另一个字符) EOT逗号ETX后面的另一个字符并不总是存在,也不总是相同的。 实例:C# 从字符串EOT逗号ETX中删除控制字符序列,c#,xml,C#,Xml,我有一些xml文件,其中一些控制序列包含在文本中:EOT,ETX(另一个字符) EOT逗号ETX后面的另一个字符并不总是存在,也不总是相同的。 实例: <FatturaElettronicaHeader xmlns=""> </F<EOT>‚<ETX>èatturaElettronicaHeader> 因此,我需要删除所有此类控制字符序列才能解析此类文件,我不确定如何通过编程检查字符是否属于控制序列。我发现我的文件中有两种错误模式:第一种是标题中
<FatturaElettronicaHeader xmlns="">
</F<EOT>‚<ETX>èatturaElettronicaHeader>
因此,我需要删除所有此类控制字符序列才能解析此类文件,我不确定如何通过编程检查字符是否属于控制序列。我发现我的文件中有两种错误模式:第一种是标题中的模式,第二种是
EOT=32u)&&(num很抱歉延迟响应,
但在我看来,问题的根源可能是p7m文件的错误解码。
我认为最初您试图清理的xml文件是一个.xml.p7m文件。
我认为清理文件的正确方法是使用库,如java或dotnet中的BuoncCastle和类CmsSignedData
CmsSignedData cmsObj = new CmsSignedData(content);
if (cmsObj.SignedContent != null)
{
using (var stream = new MemoryStream())
{
cmsObj.SignedContent.Write(stream);
content = stream.ToArray();
}
}
您能够更改源系统(生成XML的系统)吗要修复缺陷吗?不,不幸的是,源系统是另一家公司的API。我不确定这类字符用于什么。xml中使用哪种编码?示例:
我更新了答案,解决了问题请将您的答案添加为答案,而不是添加到问题中(然后将其标记为答案)。
private static string RemoveInvalidCharacters(string input)
{
while (true)
{
var start = input.IndexOf('\u0004');
if (start == -1) break;
if (input[start + 1] == '<')
{
input = input.Remove(start, 2);
continue;
}
if (input[start + 2] == '\u0003')
{
input = input.Remove(start, 4);
}
}
return input;
}
static string StripExtended(string arg)
{
StringBuilder buffer = new StringBuilder(arg.Length); //Max length
foreach (char ch in arg)
{
UInt16 num = Convert.ToUInt16(ch);//In .NET, chars are UTF-16
//The basic characters have the same code points as ASCII, and the extended characters are bigger
if ((num >= 32u) && (num <= 126u)) buffer.Append(ch);
}
return buffer.ToString();
}
CmsSignedData cmsObj = new CmsSignedData(content);
if (cmsObj.SignedContent != null)
{
using (var stream = new MemoryStream())
{
cmsObj.SignedContent.Write(stream);
content = stream.ToArray();
}
}