LINQ: удалить элемент из XML на основе значения атрибута? - PullRequest
6 голосов
/ 15 февраля 2011

Как я могу удалить любой элемент в xml на основе соответствующего значения атрибута?

Вот мой XML:

<Projects>
    <Project serverUrl="tcp://xyz1:xxx/sdfsdf.rem" projectName="project1" />
    <Project serverUrl="tcp://xyz2:xxx/sdfsdf.rem" projectName="project2" />
    <Project serverUrl="tcp://xyz3:xxx/sdfsdf.rem" projectName="project3" />
    <Project serverUrl="tcp://xyz4:xxx/sdfsdf.rem" projectName="project4" />
    <Project serverUrl="tcp://xyz5:xxx/sdfsdf.rem" projectName="project5" />
    <Project serverUrl="tcp://xyz6:xxx/sdfsdf.rem" projectName="project6" />
   </Projects>

Я использую следующий запрос LINQ:

var remove = from elemet in xdoc.Elements("Projects").Elements("Project")
                                 where elemet.Attribute("projectName").Value == "project1"
                                 select elemet.Parent.Remove();

Я получаю ошибку времени компиляции при выборе как:

Тип выражения в select Неверный пункт

РЕДАКТИРОВАТЬ ОТВЕТ: этот работает для меня. Спасибо всем

var xElement = (from elemet in xdoc.Elements("Projects").Elements("Project")
                            where elemet.Attribute("projectName").Value == foundProject
                            select elemet);
            xElement.Remove();

Ответы [ 4 ]

9 голосов
/ 15 февраля 2011

Remove - это вызов метода (void), а не функция, которая может возвращать значение. Вы, вероятно, хотите что-то вроде этого:

var elementsToRemove = from elemet in xdoc.Elements("Projects").Elements("Project")
                       where elemet.Attribute("projectName").Value == "project1"
                       select elemet;

foreach (var e in elementsToRemove)
    e.Remove();

LINQ - это язык запросов , он (в основном) используется для возврата чего-либо. Выполнение действий над этими элементами обычно является отдельным шагом.

7 голосов
/ 15 февраля 2011

Вы можете использовать

xdoc.Elements("Projects").Elements("Project").Where(
                    elemet => elemet.Attribute("projectName").Value == "project1")
.ToList().ForEach(i => i.Remove());

или

(from elemet in xdoc.Elements("Projects").Elements("Project")
                          where elemet.Attribute("projectName").Value == "project1"
                          select elemet).ToList().ForEach(i => i.Remove());
4 голосов
/ 15 февраля 2011

Вы можете использовать следующий фрагмент кода:

xdoc.XPathSelectElement("Projects/Project[@projectName = 'project1']").Remove();
1 голос
/ 15 февраля 2011

Remove() - это метод, который вы вызываете на XNode.Ваш запрос пытается выбрать метод, который не имеет никакого смысла.

Что вы действительно хотите сделать, это выбрать элемент, который хотите удалить, затем вызвать метод Remove ()на выбранный элемент.Вы можете найти пример здесь: Метод XNode.Remove

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