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

时间:2011-02-15 13:50:46

标签: c# xml linq linq-to-xml

如何根据匹配的属性值删除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 as:

上遇到编译时错误
  

select中的表达式类型   子句不正确

编辑答案: 这个对我有用。全部谢谢

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

4 个答案:

答案 0 :(得分:9)

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是查询语言,它(主要)用于返回某事。对这些元素执行操作通常是一个单独的步骤。

答案 1 :(得分: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());

答案 2 :(得分:4)

您可以使用以下代码段:

xdoc.XPathSelectElement("Projects/Project[@projectName = 'project1']").Remove();

答案 3 :(得分:1)

Remove()是您在XNode上调用的方法。您的查询正在尝试选择这个没有任何意义的方法。

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