17370845950

.NET中的DataSet怎么和XML数据互转
DataSet内置支持XML双向序列化:WriteXml()可按IgnoreSchema、WriteSchema或DiffGram模式导出数据与结构;ReadXml()自动识别并加载,但默认清空原数据;WriteXmlSchema/ReadXmlSchema用于纯XSD交换。

DataSet 是 .NET 中用于内存中缓存关系型数据的核心类,它天然支持与 XML 的双向序列化——不需要额外引用或第三方库,靠内置方法就能完成转换。

把 DataSet 写成 XML 文件或字符串

DataSet 提供 WriteXml() 方法,可直接导出为 XML 格式。它能保存数据(Rows)、结构(Schema)甚至关系(Relations)和约束(Constraints),具体行为由 XmlWriteMode 控制:

  • IgnoreSchema:只写数据,不带表结构(默认)
  • WriteSchema:同时写结构和数据,生成自描述 XML(含
  • DiffGram:保留原始值和当前值,适合变更跟踪场景(如离线同步)

示例:

ds.WriteXml("data.xml", XmlWriteMod

e.WriteSchema); // 生成带 schema 的完整 XML

从 XML 加载数据到 DataSet

ReadXml() 可将 XML 加载回 DataSet。它会自动识别是否含 Schema:

  • 如果 XML 包含内联 schema(即 WriteSchema 模式生成的),DataSet 会重建 DataTable 结构并填充数据
  • 如果只有数据(IgnoreSchema 模式),DataSet 会尝试推断列类型(如全数字 → Int32),但建议配合 schema 使用以保证准确性

注意:ReadXml 默认会清空原有表内容;若想追加,需先调用 DataSet.Merge() 或手动控制。

只读/只写 Schema(XSD)

若只需交换结构(比如定义接口契约),可用:

  • WriteXmlSchema("schema.xsd"):导出纯 XSD 文件
  • ReadXmlSchema("schema.xsd"):加载 XSD 并创建空的、结构匹配的 DataSet

这样可实现“先定结构再填数据”的协作流程,避免类型推断偏差。

常见注意事项

转换过程看似简单,但几个细节容易踩坑:

  • DateTime 列在 XML 中按 ISO 8601 格式序列化(如 "2025-05-20T14:23:15.123"),时区信息可能丢失(默认按本地时间处理)
  • Null 值会序列化为
    ,ReadXml 能正确还原为 DBNull.Value
  • DataTable.TableName 和 DataColumn.ColumnName 会原样映射为 XML 元素/属性名,建议避免空格或特殊字符
  • 嵌套关系(DataRelation)在 WriteSchema 下会生成 ,ReadXml 可自动重建关联

基本上就这些。只要用对 WriteXml / ReadXml 和对应模式,DataSet 和 XML 之间的来回转换非常直接,也不依赖外部配置。