一尘不染

在构造使用该数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的十六进制字符?

c#

在XmlReader中使用它之前,是否有任何简单/通用的方法来清理基于XML的数据源,以便我可以正常使用与XML上的十六进制字符限制不符的XML数据?

注意:

  • 该解决方案需要处理使用UTF-8以外的字符编码的XML数据源,例如,通过在XML文档声明中指定字符编码。剥离无效的十六进制字符时不改变源代码的字符编码一直是主要的问题。
  • 删除无效的十六进制字符仅应删除十六进制编码的值,因为您经常会在数据中发现恰好包含一个字符串(该字符串与十六进制字符匹配)的href值。

背景:

我需要使用符合特定格式(例如Atom或RSS提要)的基于XML的数据源,但希望能够使用已发布的数据源(根据XML规范包含无效的十六进制字符)。

在.NET中,如果您有一个表示XML数据源的Stream,然后尝试使用XmlReader和/或XPathDocument对其进行解析,则会由于XML数据中包含无效的十六进制字符而引发异常。我当前解决此问题的尝试是将Stream解析为字符串,并使用正则表达式删除和/或替换无效的十六进制字符,但是我正在寻找一种性能更高的解决方案。


阅读 228

收藏
2020-05-19

共1个答案

一尘不染

可能并不完美 (由于人们错过了此免责声明,因此添加了重点),但是在此情况下,我的工作如下。您可以调整以与流一起使用。

/// <summary>
/// Removes control characters and other non-UTF-8 characters
/// </summary>
/// <param name="inString">The string to process</param>
/// <returns>A string with no control characters or entities above 0x00FD</returns>
public static string RemoveTroublesomeCharacters(string inString)
{
    if (inString == null) return null;

    StringBuilder newString = new StringBuilder();
    char ch;

    for (int i = 0; i < inString.Length; i++)
    {

        ch = inString[i];
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        //if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
        //if using .NET version prior to 4, use above logic
        if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4
        {
            newString.Append(ch);
        }
    }
    return newString.ToString();

}
2020-05-19