如何在 C# 中从 XML 中删除一个完整的节点

How to remove a complete node from XML in C#

我有 C# 申请。下面是我的XML

<subscription>
  <subscription_add_ons type="array">
    <subscription_add_on>
      <add_on_code>bike-o-vision</add_on_code>
      <quantity type="integer">1</quantity>
    </subscription_add_on>
    <subscription_add_on>
      <add_on_code>boxx</add_on_code>
      <quantity type="integer">1</quantity>
    </subscription_add_on>
  </subscription_add_ons>
</subscription>

我需要的是如果我传递字符串 addOnCode = boxx,删除完整的节点,即

<subscription_add_on>
  <add_on_code>boxx</add_on_code>
  <quantity type="integer">1</quantity>
</subscription_add_on>

函数

  XDocument xmlDoc = XDocument.Parse(xmlString);

        XElement element = new XElement(
             "subscription_add_on",
             new XElement("add_on_code", "box"),
             new XElement("quantity",
             new XAttribute("type", "integer"),
        1
    )
);

  xmlDoc.Root.Descendants(element.Name).Remove();

但不知何故,它没有按要求删除。

如何使用 XDocument 执行此操作?

谢谢!

您需要确定要在原始文档中删除的元素,然后对这些元素调用 .Remove()

在这里,我们要查找类型为 "subscription_add_on" 的文档中的所有元素,然后过滤到具有名为 "add_on_code" 的子元素的元素,其值为 "boxx".然后我们将它们全部删除。

xmlDoc.Root
    .Descendants("subscription_add_on")
    .Where(x => x.Element("add_on_code").Value == "boxx")
    .Remove();

请注意 .Descendents() 将向下搜索多个级别(因此它会在 "subscription_add_ons" 元素内部查找 "subscription_add_on" 子元素),而 .Elements().Element() 只向下搜索一个级别。

参见MSDN docs on linq2xml, and in particular Removing Elements, Attributes, and Nodes from an XML Tree