C# 使用Linq to xml递归删除xml节点

C# 使用Linq to xml递归删除xml节点,c#,xml,linq,file-io,linq-to-xml,C#,Xml,Linq,File Io,Linq To Xml,对于LINQtoXML来说相当陌生,如何使用关系递归地删除XML节点并保存文档 无法更改xml的结构,因为它来自服务。下面是来自任务服务的xml。每个任务都可以有嵌套任务,其中可能有一个或多个嵌套任务。嵌套要达到N级 使用linq to xml删除某个父任务时,如何删除它的所有子任务 如何知道成功删除的所有节点 Xml: 在上面的xml中,当删除taskId=2时,应该删除它的子任务,即Id=3。因为3被删除了,所以它的子任务4和5也应该被删除。使用下面的答案 XDocument doc = X

对于LINQtoXML来说相当陌生,如何使用关系递归地删除XML节点并保存文档

无法更改xml的结构,因为它来自服务。下面是来自任务服务的xml。每个任务都可以有嵌套任务,其中可能有一个或多个嵌套任务。嵌套要达到N级

使用linq to xml删除某个父任务时,如何删除它的所有子任务

如何知道成功删除的所有节点

Xml:

在上面的xml中,当删除taskId=2时,应该删除它的子任务,即Id=3。因为3被删除了,所以它的子任务4和5也应该被删除。

使用下面的答案

XDocument doc = XDocument.Load("task.xml");
var q = from node in doc.Descendants("Task")
        let attr = node.Attribute("ID")
        let parent = node.Attribute("ParentId")
        where ((attr != null && attr.Value == "3") || (parent != null && parent.Value == "3"))
        select node;
q.ToList().ForEach(x => x.Remove());
doc.Save("output.xml"); 
使用下面的答案

XDocument doc = XDocument.Load("task.xml");
var q = from node in doc.Descendants("Task")
        let attr = node.Attribute("ID")
        let parent = node.Attribute("ParentId")
        where ((attr != null && attr.Value == "3") || (parent != null && parent.Value == "3"))
        select node;
q.ToList().ForEach(x => x.Remove());
doc.Save("output.xml"); 

我将假设使用xml:

<Tasks> 
  <Task ID="1">Clean the Room</Task>
  <Task ID="2">Clean the Closet</Task>
  <Task ID="3" ParentId="2">Remove the toys</Task>
  <Task ID="4" ParentId="3">Stack action Figures on Rack</Task>
  <Task ID="5" ParentId="3">Put soft toys under bed</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>
结果:

<Tasks> 
  <Task ID="1">Clean the Room</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>

我将假设使用xml:

<Tasks> 
  <Task ID="1">Clean the Room</Task>
  <Task ID="2">Clean the Closet</Task>
  <Task ID="3" ParentId="2">Remove the toys</Task>
  <Task ID="4" ParentId="3">Stack action Figures on Rack</Task>
  <Task ID="5" ParentId="3">Put soft toys under bed</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>
结果:

<Tasks> 
  <Task ID="1">Clean the Room</Task>

  <Task note="test node" />
  <Task ID="a" note="test node" />
</Tasks>

我认为这会删除ID=1的任务节点,这不是我要求的。由于ID=1的任务已被删除,如何删除它的从属任务?parentId为1的任务和parentId为“1”的任务?我已经在where linq中编辑了他的答案,用于比较父id属性。此外,dere需要对父ID Attribute进行空检查。我认为这会删除ID=1的任务节点,这不是我要求的。由于ID=1的任务已被删除,如何删除它的从属任务?parentId为1的任务和parentId为“1”的任务?我已经在where linq中编辑了他的答案,用于比较父id属性。此外,dere需要对父ID属性进行空检查。我不理解您的结构。您声明,如果Task=1,则应删除2,3,4,5,但其中没有一个ParentID=1。你的意思是任务=2吗?@ErikPhilips很抱歉搞混了。任务通过parentid属性与另一个任务相关。因此,当ID=2的任务被删除时,它的子任务(ParentId=2)也应该被删除。这个过程一直持续到当前删除的任务没有节点为止。我不理解您的结构。您声明,如果Task=1,则应删除2,3,4,5,但其中没有一个ParentID=1。你的意思是任务=2吗?@ErikPhilips很抱歉搞混了。任务通过parentid属性与另一个任务相关。因此,当ID=2的任务被删除时,它的子任务(ParentId=2)也应该被删除。此过程将继续,直到当前删除的任务没有节点为止。