我想从XML树中删除一个元素,并尝试使用以下URL中提到的方法来执行此操作。
https://msdn.microsoft.com/en-us/library/bb387051.aspx
我的XML与上面的有点不同,当我尝试使用它时,它只删除第一个节点中的Grandchild1。它没有为第二个做到这一点。
XElement root = XElement.Parse(@"<Root>
<Child1>
<GrandChild1/>
<GrandChild2/>
<GrandChild3/>
</Child1>
<Child1>
<GrandChild1/>
<GrandChild2/>
<GrandChild3/>
</Child1>
</Root>");
root.Element("Child1").Element("GrandChild1").Remove();
执行后输出:
<Child1>
<GrandChild2/>
<GrandChild3/>
</Child1>
<Child1>
<GrandChild1/>
<GrandChild2/>
<GrandChild3/>
</Child1>
预期产出:
<Child1>
<GrandChild2/>
<GrandChild3/>
</Child1>
<Child1>
<GrandChild2/>
<GrandChild3/>
</Child1>
为什么不这样做以及如何使其发挥作用?
谢谢!
答案 0 :(得分:2)
Element
方法仅返回单个元素。你想要:
root.Elements("Child1").Elements("GrandChild1").Remove();
使用:
XContainer.Elements
方法Extensions.Elements
扩展方法(在IEnumerable<T> where T : XContainer
上)Extensions.Remove
扩展方法(在IEnumerable<T> where T : XNode
上)这样就可以直接在根目录下的GrandChild1
元素下找到每个Child1
元素。如果您实际上不在乎 找到了GrandChild1
元素,那么您可以使用
root.Descendants("GrandChild1").Remove();
...但使用Elements
会让您获得更多控制权。
答案 1 :(得分:0)
因为您使用的是Element
方法,所以它只返回一个元素。您可以使用Descendants方法来实现您的目标:
root.Descendants("GrandChild1").Remove();