.NET 6中以字符串加载XML Schema失败,XmlTextReader显示None
问题分析与修复方案
关于XmlReader显示“None”的说明
调试时看到xmlReader显示“None”,本质是XmlTextReader刚创建还未开始读取数据时的默认状态,这本身不是错误,但你的代码加载Schema失败是另有原因。
核心修复步骤
1. 替换过时的XmlTextReader
XmlTextReader已经被标记为过时,改用XmlReader.Create()是更可靠的方式,它能更好地处理字符串流的读取。
2. 简化流操作(可选)
没必要绕MemoryStream转一圈,直接用StringReader读取Schema字符串更简洁,也能避免流位置相关的潜在问题。
修复后的代码示例
// 推荐写法:直接从字符串创建XmlReader using XmlReader xmlReader = XmlReader.Create(new StringReader(XsdSchemas.the_schema_string)); settings.Schemas.Add(THE_NAMESPACE_S, xmlReader); // 如果坚持用MemoryStream的写法,优化后: using (var memStream = GenerateStreamFromString(XsdSchemas.the_schema_string)) { using var xmlReader = XmlReader.Create(memStream); settings.Schemas.Add(THE_NAMESPACE_S, xmlReader); } private static MemoryStream GenerateStreamFromString(string value) { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(nameof(value)); // 直接用字节数组初始化MemoryStream,默认Position就是0,无需手动设置 return new MemoryStream(Encoding.UTF8.GetBytes(value)); }
额外排查要点
- 先验证
XsdSchemas.the_schema_string的内容是否合法:把字符串复制到本地文件,用VS或在线Schema校验工具检查有没有语法错误。 - 确认
THE_NAMESPACE_S和Schema中targetNamespace的字符串完全一致,大小写、特殊字符都不能错。 - 加载后主动编译Schema捕获异常:
try { settings.Schemas.Compile(); } catch (XmlSchemaException ex) { // 这里能拿到具体的Schema错误信息 Console.WriteLine($"Schema编译失败: {ex.Message}"); }
内容的提问来源于stack exchange,提问作者AlexB
相关产品推荐
相关产品推荐

