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

使用C#读取XML到DataGridView时遇System.Data.DuplicateNameException错误

解决DataSet读取XML时的DuplicateNameException错误

错误原因

你遇到的System.Data.DuplicateNameException是因为MySQL导出的XML结构中,多个同名的<table>节点直接作为<database>的子节点,DataSet的ReadXml方法在解析时,会为每个<table>节点尝试创建名为database_table的关系,重复创建就触发了重复名称错误。你之前尝试移除表的操作无效,因为问题出在关系重复创建,而非表本身。

解决方案

方案1:手动解析XML构建DataTable(推荐)

避开DataSet自动解析的问题,直接用XmlReader读取XML内容,手动构建DataTable后绑定到DataGridView:

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog opf = new OpenFileDialog();
    opf.Filter = "XML File | *.xml";
    opf.FileName = "";

    if (opf.ShowDialog() == DialogResult.OK)
    {
        // 创建DataTable并定义列
        DataTable dt = new DataTable("studentinfo");
        dt.Columns.Add("Stud_No", typeof(string));
        dt.Columns.Add("FirstName", typeof(string));
        dt.Columns.Add("LastName", typeof(string));
        dt.Columns.Add("Section", typeof(string));

        // 读取XML内容
        using (XmlReader reader = XmlReader.Create(opf.FileName))
        {
            while (reader.Read())
            {
                // 定位到<table>节点
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "table")
                {
                    DataRow row = dt.NewRow();
                    // 读取当前<table>下的所有<column>节点
                    using (XmlReader tableReader = reader.ReadSubtree())
                    {
                        while (tableReader.Read())
                        {
                            if (tableReader.NodeType == XmlNodeType.Element && tableReader.Name == "column")
                            {
                                string colName = tableReader.GetAttribute("name");
                                tableReader.Read(); // 移动到文本节点
                                row[colName] = tableReader.Value;
                            }
                        }
                    }
                    dt.Rows.Add(row);
                }
            }
        }

        // 绑定到DataGridView
        dataGridView1.DataSource = dt;
    }
}

方案2:修改XML结构(若允许修改源文件)

将所有<table>节点包裹在一个统一的父节点下,比如<tables>,这样DataSet能正确识别为同一表的多行数据:

修改后的XML示例:

<!--
- Database: 'sialabact'
-->
<database name="sialabact">
    <tables>
        <!-- Table studentinfo -->
        <table name="studentinfo">
            <column name="Stud_No">20-1399</column>
            <column name="FirstName">Al-Sharief</column>
            <column name="LastName">Dinglasa</column>
            <column name="Section">SBIT3E</column>
        </table>
        <!-- 其他<table>节点放在这里 -->
    </tables>
</database>

修改后原代码即可正常运行,因为DataSet会将<tables>下的所有<table>节点识别为同一个表的行数据,不会重复创建关系。

方案3:通过XmlDocument预处理XML

如果不能修改源XML文件,可先读取到XmlDocument,调整结构后再交给DataSet:

private void button1_Click(object sender, EventArgs e)
{
    OpenFileDialog opf = new OpenFileDialog();
    opf.Filter = "XML File | *.xml";
    opf.FileName = "";

    if (opf.ShowDialog() == DialogResult.OK)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(opf.FileName);

        // 创建<tables>节点
        XmlElement tablesNode = doc.CreateElement("tables");
        XmlNode databaseNode = doc.SelectSingleNode("//database");

        // 将所有<table>节点移动到<tables>下
        XmlNodeList tableNodes = databaseNode.SelectNodes("table");
        foreach (XmlNode tableNode in tableNodes)
        {
            tablesNode.AppendChild(tableNode);
        }
        databaseNode.AppendChild(tablesNode);

        // 加载修改后的XML到DataSet
        DataSet ds = new DataSet();
        using (StringReader sr = new StringReader(doc.OuterXml))
        {
            ds.ReadXml(sr);
        }
        dataGridView1.DataSource = ds.Tables["table"];
    }
}

内容的提问来源于stack exchange,提问作者RailuXal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:50:28