DataSet.ReadXml 是 C# 中将 XML 加载到 DataSet 的核心方法,支持文件路径、Stream、TextReader、XmlReader 等输入源,需 XML 符合结构约定;WriteXml 默认只写数据,推荐用 XmlWriteMode.WriteSchema 保存 Schema 以确保还原准确性。

DataSet.ReadXml 是 C# 中将 XML 数据加载到 DataSet 的核心方法,配合 WriteXml 可实现完整的读写闭环。它不依赖数据库,适合配置、缓存、轻量数据交换等场景。
ReadXml:从 XML 文件或流加载数据
支持多种输入源:文件路径、Stream、TextReader、XmlReader。最常用的是文件路径和 XmlReader(便于控制解析行为)。
- 直接传文件路径:
ds.ReadXml("data.xml")—— 简单但无法捕获格式异常细节 - 用
XmlReader更可控:var reader = XmlReader.Create("data.xml", new XmlReaderSettings { DtdProcessing = DtdProcessing.Ignore, IgnoreWhitespace = true });
ds.ReadXml(reader); - 注意:XML 必须符合 DataSet 的结构约定(如包含
或能推断出表/列),否则可能只读出数据没结构,或抛InvalidOperationException
WriteXml:保存 DataSet 到 XML
WriteXml 默认只写数据(无 Schema),若需下次准确还原结构,应显式指定 XmlWriteMode.WriteSchema。
- 仅数据:
ds.WriteXml("output.xml") - 含 Schema(推荐):
ds.WriteXml("output.xml", XmlWriteMode.WriteSchema) - 写入内存流便于后续处理:
var ms = new MemoryStream(); ds.WriteXml(ms, XmlWriteMode.WriteSchema); ms.Position = 0;
常见问题与应对
实际使用中容易遇到结构不匹配、编码错误、命名冲突等问题。
-
“根元素缺失”或“无法推断表名”:确保 XML 顶层是
(默认)或显式指定DataSet.DataSetName后再写入;也可在 XML 中用匹配 DataTable 名称 -
中文乱码:XML 文件需声明编码(如
),且XmlReader.Create不会自动识别,建议用带编码的StreamReader构造XmlReader -
DateTime 格式不一致:DataSet 默认按 ISO 8601 输出(如
2024-05-20T14:23:15.123),读取时也期望该格式;若源 XML 是 "2024/05/20",需先预处理或改用字符串列 + 手动转换
替代方案提醒
DataSet + XML 是 .NET Framework 时代的典型做法,但在 .NET Core/.NET 5+ 中已不推荐用于新项目。现代更倾向:
– 强类型对象 + System.Text.Json 或 Newtonsoft.Json(JSON 更轻、更主流)
– 需 XML 时用 XmlSerializer 序列化自定义类
– 大数据量或高性能场景避免 DataSet,改用 DataTable 或实体集合 + XmlReader/Writer 流式处理










