XmlTextReader无效字符异常-字符为'¢'的象征

本文关键字:字符 #162 无效 XmlTextReader 异常 | 更新日期: 2023-09-27 18:06:40

我得到

给定编码中的无效字符。

尝试在包含'¢'符号的xml元素中Read()文本时出现异常。

XML元素看起来像这样:

<COMMENTS>NOTE:
         5¢                                   50                                          10,000
        25¢                                  10                                             2,000</COMMENTS>

我尝试使用。net的XmlConvert类(它声称修复这些类型的问题),但它没有检测到'¢'符号无效。

  public PaytableReaderStrategy(string filepath)
    {
        if (!File.Exists(filepath))
            throw new ApplicationException("Could not read .xml from provided filepath.");

        string content = File.ReadAllText(filepath);
        if (!IsValidXmlString(content))
            File.WriteAllText(filepath, RemoveInvalidXmlChars(content));

        Reader = new XmlTextReader(filepath);
    }
    private static string RemoveInvalidXmlChars(string text)
    {
        var validXmlChars = text.Where(ch => XmlConvert.IsXmlChar(ch)).ToArray();
        return new string(validXmlChars);
    }
    private static bool IsValidXmlString(string text)
    {
        try
        {
            XmlConvert.VerifyXmlChars(text);
            return true;
        }
        catch
        {
            return false;
        }
    }

是否有一个。net风格的解决方案来处理这个问题,不只是'¢'符号,但检测和删除任何冒犯符号?

XmlTextReader无效字符异常-字符为'¢'的象征

正如评论中所暗示的那样,问题是您的文件将默认使用Encoding.UTF8解码,但您的文件不是用UTF8编码的。这意味着正常ASCII集之外的字符将无法正确解码。

您可以通过使用StreamReader并将其传递给XmlReader.Create来指定编码:

var sr = new StreamReader(filepath, Encoding.Default);
Reader = XmlReader.Create(sr);

注意,您应该确保在完成读取文件后,将Readersr都处理掉。