You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 10:07:18