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

C#读取XML到DataSet遇同名嵌套元素报错该如何解决

可行解决方案

方案1:预处理XML删除无用节点

实现逻辑最简单,对原有业务代码侵入性最低,适合XML文件体积不大的场景:

// 需引入命名空间 using System.Xml.Linq;
XDocument xDoc = XDocument.Load(FILENAME);
// 移除所有CreditCardDetail节点
xDoc.Descendants("CreditCardDetail").Remove();

DataSet dset = new DataSet();
// 加载处理后的XML到DataSet
dset.ReadXml(xDoc.CreateReader());

提示:如果CreditCardDetail节点带有命名空间,需使用XName.Get("CreditCardDetail", "对应命名空间URI")定位节点,避免删除失败。

方案2:流式读取跳过指定节点

适合大体积XML文件,无需先加载整个XML到内存,读取过程中直接过滤无用节点:

DataSet dset = new DataSet();
using (XmlReader reader = XmlReader.Create(FILENAME))
{
    while (reader.Read())
    {
        // 遇到CreditCardDetail节点直接跳过
        if (reader.NodeType == XmlNodeType.Element && reader.Name == "CreditCardDetail")
        {
            reader.Skip();
            continue;
        }
        // 其余节点正常读入DataSet
        dset.ReadXml(reader);
    }
}

方案3:预定义DataSet Schema固定读取规则

提前指定需要加载的表、字段结构,读取XML时会自动忽略Schema外的所有节点,还能避免后续XML结构波动引发的其他读取异常:

DataSet dset = new DataSet();
// 提前定义PaymentData表的需要用到的字段结构
DataTable paymentTable = new DataTable("PaymentData");
// 可根据实际业务调整字段类型,比如decimal、int等
paymentTable.Columns.Add("Amount", typeof(string));
paymentTable.Columns.Add("Change", typeof(string));
dset.Tables.Add(paymentTable);

// 读取XML时仅加载匹配Schema的内容
dset.ReadXml(FILENAME);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:27:01