C#中如何将XML子节点添加到指定父节点(XDocument实现)
用XDocument实现节点迁移到新增节点的方案
完全明白你的需求,咱们用XDocument就能轻松搞定这个XML结构调整,下面是具体的实现步骤和代码:
核心思路
- 加载目标XML文档到
XDocument实例 - 定位到
<sheet1>根节点 - 创建新的
<table>节点 - 把
<sheet1>下所有<rd>节点迁移到新的<table>里(注意规避遍历集合时修改集合的常见坑) - 将
<table>节点添加回<sheet1> - 保存或输出修改后的XML
完整代码示例
// 从文件加载XML(也可以用XDocument.Parse()从字符串加载) XDocument xmlDoc = XDocument.Load("your-source.xml"); // 获取<sheet1>节点,先做非空判断避免空引用异常 XElement sheet1Node = xmlDoc.Element("sheet1"); if (sheet1Node != null) { // 创建新的<table>节点 XElement tableNode = new XElement("table"); // 这里一定要调用ToList()!否则遍历过程中移除节点会触发集合修改异常 foreach (XElement rdNode in sheet1Node.Elements("rd").ToList()) { // 先从<sheet1>移除<rd>,再添加到<table>节点中 rdNode.Remove(); tableNode.Add(rdNode); } // 把建好的<table>节点加到<sheet1>下面 sheet1Node.Add(tableNode); // 保存修改后的XML到文件 xmlDoc.Save("your-modified.xml"); }
效果验证
修改前的XML结构:
<sheet1> <rd>内容1</rd> <rd>内容2</rd> </sheet1>
修改后的XML结构:
<sheet1> <table> <rd>内容1</rd> <rd>内容2</rd> </table> </sheet1>
关键注意点
为什么要调用ToList()?因为sheet1Node.Elements("rd")返回的是一个延迟加载的集合,直接遍历的时候如果移除节点,集合的实时状态会发生变化,导致InvalidOperationException。转成List之后会把所有<rd>节点先加载到内存里,遍历操作就不会受后续移除动作的影响了。
内容的提问来源于stack exchange,提问作者Uzarsef
相关产品推荐
相关产品推荐

