C# 使用Linq to xml递归删除xml节点
对于LINQtoXML来说相当陌生,如何使用关系递归地删除XML节点并保存文档 无法更改xml的结构,因为它来自服务。下面是来自任务服务的xml。每个任务都可以有嵌套任务,其中可能有一个或多个嵌套任务。嵌套要达到N级 使用linq to xml删除某个父任务时,如何删除它的所有子任务 如何知道成功删除的所有节点 Xml: 在上面的xml中,当删除taskId=2时,应该删除它的子任务,即Id=3。因为3被删除了,所以它的子任务4和5也应该被删除。使用下面的答案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
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)也应该被删除。此过程将继续,直到当前删除的任务没有节点为止。