C#解析上传的XML文件 XmlDocument如何加载Stream-XML/RSS教程

XmlDocument.Load(Stream) 要求流支持随机访问(CanSeek==true),而上传流如HttpRequest.Body或IFormFile.OpenReadStream()通常不可寻址,直接调用会因Seek操作抛出NotSupportedException;正确做法是先将流复制到MemoryStream并重置位置,再用配置了DtdProcessing.Ignore和XmlResolver=null的XmlReader安全解析。

XmlDocument.Load(Stream) 会抛出“无法从流中读取 XML 声明”异常

直接调用 XmlDocument.Load(Stream) 很可能失败,尤其当上传的 Stream 是 HttpRequest.Body 或 MultipartFormDataStreamProvider 输出的流时。根本原因是:该方法要求流必须支持随机访问(CanSeek == true),而多数上传流是只读、不可回溯的(CanSeek == false)。一旦流不支持定位,XmlDocument 在解析 XML 声明或 DTD 时会尝试 Seek(0, SeekOrigin.Begin),立刻抛出 NotSupportedException。

  • 不要对原始上传流直接调用 XmlDocument.Load(stream)
  • 若流来自 HttpContext.Request.Body(ASP.NET Core)或 Request.InputStream(.NET Framework),默认不可寻址
  • 即使你手动调用 stream.Position = 0,也会触发异常,因为底层不支持

正确做法:用 XmlReader 包装 MemoryStream 或 BufferedStream

核心思路是把不可寻址的流先复制进一个可读写的内存缓冲区(MemoryStream),再用 XmlReader 安全解析——这是最稳定、兼容性最好的方式。注意:不是用 XmlDocument.Load(XmlReader),而是先构造带设置的 XmlReader,再传给 Load()。

  • 启用 XmlReaderSettings.DtdProcessing = DtdProcessing.Ignore 防止 XXE 攻击
  • 设置 XmlReaderSettings.XmlResolver = null 禁用外部实体解析
  • MemoryStream 必须在构造后重置位置:ms.Position = 0
  • 务必使用 using 确保 XmlReader 和流被释放
var ms = new MemoryStream();
await stream.CopyToAsync(ms);
ms.Position = 0;

var settings = new XmlReaderSettings
{
    DtdProcessing = DtdProcessing.Ignore,
    XmlResolver = null,
    ValidationType = ValidationType.None
};

using var reader = XmlReader.Create(ms, settings);
var doc = new XmlDocument();
doc.Load(reader);

ASP.NET Core 中处理 IFormFile 的完整链路

上传文件通常走 IFormFile,它的 OpenReadStream() 返回的就是不可寻址流。不能跳过复制步骤,也不能依赖 file.CopyTo() 后直接 Load —— 因为 CopyTo 不改变原流位置,且目标流未必可读。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C#解析上传的XML文件 XmlDocument如何加载Stream-XML/RSS教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3992317+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3992317+
  • 本周更新: 0+
  • 最后更新: 2026-03-16