Подтвердить что ты не робот

Как удалить элемент из xml с помощью Xdocument, когда у нас есть несколько элементов с тем же именем, но с разными атрибутами

У меня есть xml-документ, который выглядит так:

<Applications>
  <myApp>
    <add key="ErrorDestinationEventLog" value="EventLog" />
    <add key="version" value="5.0.0.0" />
    <add key="DebugMode_RUN" value="true" />
  </myApp>
</Applications>

Все элементы имеют одинаковое имя элемента, но разные атрибуты. Как удалить один конкретный элемент и его атрибуты из этого xml с помощью XDocument в С#?

xd.Element("Applications").Element("myApp").Element(xe.Name).RemoveAll();

Вышеуказанная команда не работает, поскольку все элементы имеют одинаковое имя.

Есть ли способ идентифицировать элемент с, кроме имени? И если да, то как я могу использовать это, чтобы удалить его из XDocument?

4b9b3361

Ответ 1

string key = "version";
XDocument xdoc = XDocument.Load(path_to_xml);
xdoc.Descendants("add")
    .Where(x => (string)x.Attribute("key") == key)
    .Remove();

ОБНОВЛЕНИЕ Вы почти выполнили эту работу. То, что вы пропустили, - это фильтрация элементов по значению атрибута. Вот ваш код с фильтрацией и удалением выбранных элементов:

xd.Element("Applications")
  .Element("myApp")
  .Elements("add")
  .Where(x => (string)x.Attribute("key") == key)
  .Remove();

Ответ 2

xd.Descendants("add")
    .First(a => a.Attribute("key").Value == "version")
    .Remove();

Если у вас есть теги, отличные от myApp под Applications, содержащие add, вы можете предпочесть более безопасную версию

xd.Descendants("myApp").First()
    .Descendants("add")
    .Where(x => (string)x.Attribute("key") == "version")
    .Remove();

Вы также можете использовать XPath (System.Xml.XPath)

string key="version";
xd.XPathSelectElement(String.Format("//myApp/add[@key='{0}']",key)).Remove();