LINQ: 根据属性值从 XML 中删除元素?

8

我可以基于匹配的属性值从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个回答

10

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
您可以使用

标签。

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
您可以使用以下代码片段:
xdoc.XPathSelectElement("Projects/Project[@projectName = 'project1']").Remove();

1

Remove() 是您在 XNode 上调用的方法。您的查询试图“选择”该方法,这是没有任何意义的。

实际上,您想要做的是选择要删除的项,然后在所选项目上调用 Remove() 方法。您可以在此处找到示例: XNode.Remove Method


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接