XDocument 删除节点

6
我有一个XML文件。
<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();

但是没有运气。

如果我知道的话就不会问了 :-) - user137348
2个回答

19

如果您想删除每个 beforeInit 或 afterInit 的所有出现,您可以使用:

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

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


或者简写形式:xml...<beforeInit>.First.Remove()。 - Drunken Code Monkey
6
“e.Name”实际上应该是“e.Name.LocalName”吗? - Joe Phillips
@Stephan Schinkel,如果存在BeforeInit,我该如何删除所有头部内容? - Lutch

3
如果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()只返回节点的直接子级。如果您想要所有后代,无论层次多深,您需要使用Descendants()。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接