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());
}