You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:55:16