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

