Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ删除没有子节点的Xelement?_C#_Linq_Linq To Xml - Fatal编程技术网

C# 如何使用LINQ删除没有子节点的Xelement?

C# 如何使用LINQ删除没有子节点的Xelement?,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,这是我的XML <A> <B id="ABC"> <C name="A" /> <C name="B" /> </B> <X> <B id="ZYZ"> <C name="A" /> <C name="B" /> </B> </X> </A>

这是我的
XML

<A>
    <B  id="ABC">
      <C name="A" />
      <C name="B" />     
    </B>
    <X>
     <B id="ZYZ">
      <C name="A" />
      <C name="B" />
     </B>
    </X>
</A>
但是正在删除整个

预期输出:

<A>
    <B  id="ABC">
      <C name="A" />
      <C name="B" />     
    </B>
     <B id="ZYZ">
      <C name="A" />
      <C name="B" />
     </B>
</A>

批准的答案将始终在文档末尾添加子项。如果您需要删除文档中间的条目,并保持孩子在他们坐的地方,请执行以下操作:

x.AddAfterSelf(x.Nodes());
x.Remove();
以下代码将删除所有将子节点保留在正确位置的
节点:

while (doc.Descendants("x").Count() > 0)
{
    var x = doc.Descendants("x").First();
    x.AddAfterSelf(x.Nodes());
    x.Remove();
}

稍微改进一下迈克有用的答案

不能只迭代
子体一次的原因是
AddAfterSelf()
创建副本。在第一次删除之后,您将迭代被删除元素的子元素,而不是文档中的替换元素

但是,如果向后迭代,则所有复制的子项都已被处理,因此您只需通过一次即可:

foreach(var x in xdoc.Descendants("x").Reverse())
{
    x.AddAfterSelf(x.Nodes());
    x.Remove();
}

如果节点名称已弃用,且不能在整个文档中使用,请使用ReplaceWith:

var xNode = doc.Descendants("x");
for (int i = 0; i < xNode.Count; i++)
{
    xNode[i].ReplaceWith(xNode[i].Nodes());
}
var xNode=doc.substands(“x”);
对于(int i=0;i
我建议添加到
x
的上一个父元素中。。。。还支持多个
X
元素。
foreach(var x in xdoc.Descendants("x").Reverse())
{
    x.AddAfterSelf(x.Nodes());
    x.Remove();
}
var xNode = doc.Descendants("x");
for (int i = 0; i < xNode.Count; i++)
{
    xNode[i].ReplaceWith(xNode[i].Nodes());
}