如何将XML转换为DataTable?XmlReader解析绑定至DataTable的完整实现
解析XML并绑定数据到DataTable的解决方案
问题描述
我有一个XML格式的文件,希望解析该文件并将数据绑定至DataTable。
XML文件内容
<StudentListSubject> <Member personId="1" active="yes"> <Name id="Mary"/> <SubjectList> <Subjectvalue>Maths</Subjectvalue> <Subjectvalue>Literature</Subjectvalue> </SubjectList> </Member> <Member personId="2" active="yes"> <Name id="John"/> <SubjectList> <Subjectvalue>Physics</Subjectvalue> <Subjectvalue>Maths</Subjectvalue> <Subjectvalue>Literature</Subjectvalue> </SubjectList> </Member> </StudentListSubject>
期望的DataTable格式
期望生成的DataTable包含3列,格式如下:
PersonID#ID#Subject 1#Mary#Maths,Literature 2#John#Physics,Maths,Literature
现有代码问题
我已使用XmlReader获取数据,但仅能获取personId,无法正确获取Name的id属性及SubjectList中的科目列表,现有代码如下:
var _dt = new DataTable(); _dt.Columns.Add("ID", typeof(string)); _dt.Columns.Add("Name", typeof(string)); _dt.Columns.Add("Subject", typeof(string)); var _rd = XmlReader.Create("C:\test.xml"); _rd.ReadToFollowing("Member"); do { var _str = ""; _rd.MoveToFirstAttribute(); _str += _rd.Value; //get personID _rd.ReadToFollowing("Name"); _rd.MoveToFirstAttribute(); _str += "#" + _rd.Value; //get ID ////get subject list _dt.Rows.Add(_str.Split('#')); } while (_rd.ReadToFollowing("Member"));
完善后的代码
var _dt = new DataTable(); // 调整列名与需求的格式匹配 _dt.Columns.Add("PersonID", typeof(string)); _dt.Columns.Add("ID", typeof(string)); _dt.Columns.Add("Subject", typeof(string)); // 使用using语句确保XmlReader资源自动释放 using var _rd = XmlReader.Create(@"C:\test.xml"); _rd.ReadToFollowing("Member"); do { // 直接获取personId属性值 string personId = _rd.GetAttribute("personId"); // 定位到Name节点并获取id属性 _rd.ReadToFollowing("Name"); string nameId = _rd.GetAttribute("id"); // 定位到SubjectList节点,收集所有科目 _rd.ReadToFollowing("SubjectList"); List<string> subjects = new List<string>(); if (_rd.ReadToDescendant("Subjectvalue")) { do { // 读取科目文本内容 subjects.Add(_rd.ReadElementContentAsString()); } while (_rd.ReadToNextSibling("Subjectvalue")); } // 将科目列表拼接为逗号分隔的字符串 string subjectStr = string.Join(",", subjects); // 直接构造DataRow添加到表格 _dt.Rows.Add(personId, nameId, subjectStr); } while (_rd.ReadToFollowing("Member"));
关键修改说明
- 使用
GetAttribute直接获取属性值,比MoveToFirstAttribute更直观且不易出错 - 调整DataTable列名与需求的
PersonID#ID#Subject完全对应 - 增加
using语句管理XmlReader资源,避免内存泄漏 - 遍历SubjectList下所有Subjectvalue节点,收集文本后拼接成目标格式字符串
- 放弃字符串拼接后拆分的方式,直接构造DataRow数据,逻辑更清晰可靠
内容的提问来源于stack exchange,提问作者Headshot
相关产品推荐
相关产品推荐

