使用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
相关产品推荐
相关产品推荐

