РЕДАКТИРОВАТЬ: Хм ... я не знал об этом Remove
метод расширения раньше.
Проблема в том, что при преобразовании элемента в строку он объединяет все нисходящие текстовые узлы ... поэтому значение элемента "Joe" на самом деле равно "Joe the still".
Вам нужны только direct дочерние текстовые узлы,Честно говоря, было бы проще, если бы имя было в атрибуте, а не в качестве содержимого, но оно все равно должно быть выполнимым ...
Кроме того, вы ищете элементы FirstName
непосредственно под BookParticipants
, а неBookParticipant
.
Это работает, хотя это не очень приятно:
xDocument.Descendants("BookParticipants")
.Elements()
.Where(x => x.Elements("FirstName")
.Nodes()
.OfType<XText>()
.Any(t => t.Value== "Joe"))
.Remove();
Вы можете изменить первый бит на
xDocument.Descendants("BookParticipant")
.Where(...)
, если хотите, тоже.
(Опять же, если вы можете использовать атрибуты для строковых значений, а не содержимое в элементах, это облегчает жизнь.)