C#如何移除XML中导致XslCompiledTransform.Transform报错的非UTF-8无效字符
问题核心原因
你遇到的0xFFFE属于XML 1.0规范明确禁止出现在文档中的字符,同类无效字符还包括0xFFFF、0x00-0x08、0x0B-0x0C、0x0E-0x1F等控制字符。
你之前用XmlConvert.IsXmlChar逐个校验原字符串无效,是因为在原字符串中是8个独立的合法字符,只有当XmlReader解析成实际的0xFFFE字符之后才会被识别为无效。
可行解决方案
方案1:直接清理字符串中的无效字符及转义实体
直接在预处理阶段同时清理明文无效字符和转义形式的无效字符实体,替换你原有的RemoveXmlNotSupportedSigns方法即可:
using System; using System.Text; using System.Text.RegularExpressions; using System.Xml; public static string RemoveInvalidXmlChars(string input) { if (string.IsNullOrEmpty(input)) return input; StringBuilder sb = new StringBuilder(input.Length); // 先清理明文中的无效字符 foreach (char c in input) { if (XmlConvert.IsXmlChar(c)) { sb.Append(c); } } string result = sb.ToString(); // 清理转义形式的无效字符实体,可根据需要扩展过滤范围 result = Regex.Replace(result, @"&#x(0{0,3}[0-1B-CEF][0-9A-F]|FFF[EF]);", "", RegexOptions.IgnoreCase); return result; }
方案2:读取阶段自动过滤(更稳妥)
自定义字符串读取类,在XmlReader解析内容阶段自动跳过所有无效字符,不需要手动处理转义实体:
using System.IO; using System.Xml; public class XmlSafeStringReader : StringReader { public XmlSafeStringReader(string s) : base(s) { } public override int Read() { int c = base.Read(); while (c != -1 && !XmlConvert.IsXmlChar((char)c)) { c = base.Read(); } return c; } public override int Read(char[] buffer, int index, int count) { int read = base.Read(buffer, index, count); int validCount = 0; for (int i = 0; i < read; i++) { if (XmlConvert.IsXmlChar(buffer[index + i])) { buffer[index + validCount++] = buffer[index + i]; } } return validCount; } }
使用时替换你原代码中的StringReader即可:
// 替换前:using (StringReader sr = new StringReader(document)) using (StringReader sr = new XmlSafeStringReader(document))
现有代码修正提示
你当前代码中直接调用XslCompiledTransform的静态Load和Transform方法会报错,该类为非静态类需要先实例化:
// 修正后的调用逻辑 XslCompiledTransform xslt = new XslCompiledTransform(); xslt.Load(xmlReader, settings, resolver); xslt.Transform(xmlR, argsList, xmlW, resolver);
内容的提问来源于stack exchange,提问作者gacaba3982
相关产品推荐
相关产品推荐

