将 XElement 添加到列表并使其 children 成为列表的剩余部分

Add XElement to list and have it's children be remainder of list

如果我有以下xml:

<Employees>
<Person>
    <ID>1000</ID>
    <Name>Nima</Name>
    <LName>Agha</LName>
</Person>
<Person>
    <ID>1002</ID>
    <Name>Ligha</Name>
    <LName>Ligha</LName>
</Person>
<Person>
    <ID>1003</ID>
    <Name>Jigha</Name>
    <LName>Jigha</LName>
</Person>
</Employees>

我想在一个索引节点之后添加一个新节点,并将剩余的人节点添加为这个新节点的children。

因此添加后的新 xml 将如下所示:

<Employees>
<Person>
    <ID>1000</ID>
    <Name>Nima</Name>
    <LName>Agha</LName>
</Person>
<RefNode>
    <Person>
        <ID>1002</ID>
        <Name>Ligha</Name>
        <LName>Ligha</LName>
    </Person>
    <Person>
        <ID>1003</ID>
        <Name>Jigha</Name>
        <LName>Jigha</LName>
    </Person>
</RefNode>
</Employees>

到目前为止,我已经尝试使用

ElementAt(index).AddAfterSelf()

但这只是将它添加到下一行,并没有将接下来的两个人添加为 children。

您可以按照以下方式进行。已在代码中添加注释以便更好地理解

var xdoc = XDocument.Parse(xml);

// Unclear how you are identifying the node after which the change has to happen. For sake of example, using ID
var selectedNode = xdoc.Descendants("Person")
                       .First(x=>Convert.ToInt32(x.Element("ID").Value)==1000);

// Collection of nodes that would be added as child of newly inserted node
var nodeAfterSelectedNode = xdoc.Descendants("Person")
                                .SkipWhile(x=>x==selectedNode) 
                                .ToList();

// Create the new node with previously identified 'nodeAfterSelectedNode' as Children
var newElement = new XElement("RefNode",nodeAfterSelectedNode);

// Remove the existing Nodes (ones that are being moved to child) 
foreach(var node in nodeAfterSelectedNode)
{
   node.Remove();
}
// add the new node 
selectedNode.AddAfterSelf(newElement);
var newXml = xdoc.ToString();

输出

<Employees>
  <Person>
    <ID>1000</ID>
    <Name>Nima</Name>
    <LName>Agha</LName>
  </Person>
  <RefNode>
    <Person>
      <ID>1002</ID>
      <Name>Ligha</Name>
      <LName>Ligha</LName>
    </Person>
    <Person>
      <ID>1003</ID>
      <Name>Jigha</Name>
      <LName>Jigha</LName>
    </Person>
  </RefNode>
</Employees>

输出样本