Как удалить родительский узел в XML, если у него есть дочерний узел с указанным значением c в C# - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно удалить родительский узел из документа XML, если у него есть дочерний узел с указанным значением c.

Например, моя строка XML выглядит следующим образом:

<Container>
    <Objects>
        <Object>
            <Id>1</Id>
        </Object>
        <Object>
            <Id>2</Id>
        </Object>
    </Objects>
</Container>

Я анализирую это как XDocument:

var container = XDocument.Parse(aboveXmlString);

Теперь мне нужно удалить тег <Object>, который имеет тег <Id> со значением 1. Я могу пройти элементы, используя:

container.Element("Objects").Element("Object").Element("Id")

Но если я добавлю .Remove() к приведенному выше коду, он удалит <Id> из XML. Как получить доступ к родительскому элементу и удалить родительский элемент <Object>. Я путаюсь с этим XDocument, поскольку я новичок в этом.

После удаления мне нужно мое XML следующим образом,

<Container>
    <Objects>
        <Object>
            <Id>2</Id>
        </Object>
    </Objects>
</Container>

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Вы можете попытаться получить все дочерние элементы узла Objects и удалить элемент, чье дочернее значение Id равно "1"

var objects = container.Root?.Element("Objects")?.Elements();
objects?.Where(o => o.Element("Id")?.Value == "1").Remove();
Console.WriteLine(container);

Будет напечатано

<Container>
  <Objects>
    <Object>
      <Id>2</Id>
    </Object>
  </Objects>
</Container>

Не забудьте получить доступ к Root из XDocument экземпляра, а не к самому экземпляру

1 голос
/ 25 марта 2020

Вы можете использовать Linq, чтобы удалить элементы из xml, например, следующий код:

1 - удалить все Object, которые имеют Id=1:

XDocument container = XDocument.Parse(aboveXmlString);

container.Descendants("Object")
    .Where(x => x.Element("Id").Value == "1")
    .Remove();

2 - если вам нужно удалить только первый элемент, который имеет Id=1:

container.Descendants("Object")
    .FirstOrDefault(x => x.Element("Id").Value == "1")
    ?.Remove();

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...