XDocument删除节点

时间:2010-12-21 14:57:24

标签: c# linq-to-xml

我有一个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();

但没有运气。

2 个答案:

答案 0 :(得分:15)

如果要删除beforeInit或afterInit的每个出现,可以使用

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

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

答案 1 :(得分: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()仅返回节点的直接子节点。如果你想要所有的后代,无论在什么级别,你都想要后代()。