从XDocument中删除节点

本文关键字:节点 删除 XDocument | 更新日期: 2023-09-27 18:04:19

我在XDocument中有以下XML片段

  <axes dimension="y">
    <axis id="y11" scale="log" label="label1">
      ...
    </axis>
    <axis id="y12" scale="log" label="label1">
      ...
    </axis>
  </axes>
  <axes dimension="x">
    <axis id="x0" label="">
      ...
    </axis>
    <axis id="x1" label="">
      ...
    </axis>
  </axes>

这是在一个XDocument中,我想从它删除y12轴,并留下其余部分。因此,最终输出将是

  <axes dimension="y">
    <axis id="y11" scale="log" label="label1">
      ...
    </axis>
  </axes>
  <axes dimension="x">
    <axis id="x0" label="">
      ...
    </axis>
    <axis id="x1" label="">
      ...
    </axis>
  </axes>

如何做到这一点?

我试过了,但是行不通

xDocument
   .Elements("axes")
   .Where(x => (string)x.Attribute("dimension") == "y")
   .Elements("axis")
   .Where(x => (string)x.Attribute("id") == "y12")
   .Remove();

从XDocument中删除节点

由于您使用的是XDocument,而不是XElement,因此您应该使用Root属性,以便使Elements方法按预期工作并查找根元素:

代替xDocument.Elements("axes")...
xDocument.Root.Elements("axes")
  .Where(x => (string)x.Attribute("dimension") == "y")
  .Elements("axis")
  .Where(x => (string)x.Attribute("id") == "y12")
  .Remove();

或者,您可以直接使用Descendants跳过Root:

 xDocument.Descendants("axes")
   .Where(x => (string)x.Attribute("dimension") == "y")
   .Elements("axis")
   .Where(x => (string)x.Attribute("id") == "y12")
   .Remove();

试试这个:

 xDocument.Descendants("axis")
   .Where(x => (string)x.Attribute("id") == "y12")
   .Remove();