如何在LINQ中添加一个元素作为第n个子元素

本文关键字:元素 一个 LINQ 添加 | 更新日期: 2023-09-27 18:13:57

我想完成下面的XML,以便所有父元素都有所有3个子元素。

<Parent>
  <Child1></Child1>
  <Child2></Child2>
  <Child3></Child3>
</Parent>
<Parent>
  <Child3></Child3>
</Parent>
<Parent>
  <Child1></Child1>
  <Child3></Child3>
</Parent>
所以我得到了下面的代码
var elementsToChange = inputDoc.Descendants(CommonConstant.Parent);
foreach (var element in elementsToChange)
{
   if (element.Element(CommonConstant.Child1) == null) 
   { 
     //add child1 at 1
   }      
   if (element.Element(CommonConstant.Child2) == null) 
   { 
     //add child2 at 2
   }       
}

但是我在元素上找不到Insert()或AddAT()。(因为我不知道存在什么子元素,所以在self之后或之前使用add都很难。)

是否有一种方法可以在某个位置添加子节点?

如何在LINQ中添加一个元素作为第n个子元素

XmlElement有两种方法来添加智利:Append和Prepend,添加到子列表开始的末尾。你不能在中间加。

如果你真的想这样做,你可以删除所有的子元素(RemoveAll,但这也会删除属性,你在这个例子中没有),然后按你想要的顺序添加(AppendChild)。

试试这个:

foreach (var element in elementsToChange)
{
  XElement lastChild = null;
  foreach(var childName in Enumerable.Range(1, 3).Select(x => "Child" + x))
  {
    var child = element.Element(childName);
    if(child == null)
    {
      child = new XElement(childName);
      if(lastChild == null)
        element.AddFirst(child);
      else
      {
        lastChild.AddAfterSelf(child);
      }
    }
    lastChild = child;
  }
}