如何在XML中按表名嵌套ADO.NET DataSet的表数据?
嘿,我来帮你把这个ADO.NET DataSet导出XML的问题讲明白!
ADO.NET DataSet导出XML:ColumnMapping的影响
先明确你的场景
数据库调用返回两个独立查询的结果到DataSet:
SELECT name, surname FROM [Users];SELECT color FROM [Colors];
你用GetXml()或者WriteXml()导出XML,并且设置了ds.Tables[0].ColumnMapping = MappingType.Attribute
默认的导出行为(不设置ColumnMapping)
默认情况下,DataTable的列会被映射成XML元素,导出的XML大概长这样:
<NewDataSet> <Users> <name>张三</name> <surname>张</surname> </Users> <Users> <name>李四</name> <surname>李</surname> </Users> <Colors> <color>Red</color> </Colors> <Colors> <color>Blue</color> </Colors> </NewDataSet>
设置MappingType.Attribute后的变化
当你给第一个表(也就是Users表,对应Tables[0])设置列映射为Attribute后,这个表的所有列都会变成XML元素的属性,而第二个表(Colors)还是保持默认的元素映射,最终导出的XML会变成这样:
<NewDataSet> <Users name="张三" surname="张" /> <Users name="李四" surname="李" /> <Colors> <color>Red</color> </Colors> <Colors> <color>Blue</color> </Colors> </NewDataSet>
完整的代码示例
// 假设MyLogic.GetDataSet()已经返回包含两个表的DataSet DataSet ds = MyLogic.GetDataSet(); // 给第一个表(Users)设置列映射为Attribute ds.Tables[0].ColumnMapping = MappingType.Attribute; // 导出成XML字符串 string xmlOutput = ds.GetXml(); // 或者直接写入到文件 ds.WriteXml(@"C:\your-output-path.xml");
几个关键细节要注意
ColumnMapping是针对单个DataTable独立设置的,你可以给不同的表配置不同的映射方式,比如一个用Attribute,一个用Element- 如果想让DataSet里所有表都用Attribute映射,直接遍历设置就行:
foreach(DataTable table in ds.Tables) { table.ColumnMapping = MappingType.Attribute; } MappingType还有其他选项:MappingType.Element(默认值)、MappingType.Hidden(该列不导出到XML)、MappingType.SimpleContent(列值作为元素的文本内容)
内容的提问来源于stack exchange,提问作者EvilDr




