Как удалить полный узел из XML в C # - PullRequest
0 голосов
/ 27 марта 2019

У меня есть 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?

Спасибо!

1 Ответ

2 голосов
/ 27 марта 2019

Вам необходимо определить элементы, которые вы хотите удалить в исходном документе, а затем вызвать .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 на linq2xml , и в частности Удаление элементов, атрибутов и узлов из дерева XML .

...