2010-12-21 64 views
5

我有一个XML文件的XDocument删除节点

<rows> 
    <head> 
    <beforeInit> 
     <call command="attachHeader"> 
     <param>#text_filter,#text_filter,#text_filter,#text_filter,#text_filter,#text_filter</param> 
     </call> 
    </beforeInit> 
    <afterInit> 
     <call command="enablePaging"> 
     <param>recinfoArea</param> 
     </call> 
    </afterInit> 
    <column width="100" align="center" type="ro" sort="server" color="undefined" id="Id">Id</column> 
    <column width="100" align="center" type="ro" sort="server" color="undefined" id="NazovProjektu">NazovProjektu</column> 
    </head> 
</rows> 

我想删除beforeInit和afterInit元素。

我试图

xml.Elements().Where(e=>e.Name == "beforeInit" || e.Name == "afterInit").Remove(); 

,但没有运气。

+0

如果我知道我不会问:-) – user137348 2010-12-21 15:02:36

回答

15

,如果你想删除beforeInit的每一次出现或afterInit你可以使用

xml.Descendants().Where(e=>e.Name == "beforeInit" || e.Name == "afterInit").Remove(); 

(后代,而不是元素)。 elements()返回直接子节点的列表,而后代返回每个节点。

+0

或简称:xml ... .First.Remove() – 2014-10-10 16:37:20

2

如果XML是一种的XElement,尝试:

xml.Element("head").Elements().Where(e=>e.Name == "beforeInit" || e.Name == "afterInit").Remove(); 

否则,如果它是一个XDocument:

xml.Root.Element("head").Elements().Where(e=>e.Name == "beforeInit" || e.Name == "afterInit").Remove(); 

,现在是这样的,它的成立,以寻找在<rows>子元素,而不是<head>。换句话说,Elements()只返回节点的直接子节点。如果你想要所有的后代,无论什么级别,你都希望后代()。