2011-02-15 123 views
6

如何根據匹配的屬性值刪除xml中的任何元素?LINQ:根據屬性值從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(); 

我得到的編譯時錯誤選擇爲:

的類型在選擇 子句中的表達式不正確

編輯回答: 這個爲我工作。感謝所有

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

回答

4

您可以使用下面的代碼片段:

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

Remove()是你上XNode調用一個方法。您的查詢正在嘗試選擇這種方法沒有任何意義。

你真正想要做的是選擇你想要刪除的項目,然後調用所選項目上的Remove()方法。你可以在這裏找到一個例子: XNode.Remove Method

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()); 
9

Remove是(無效)方法調用,而不是可以返回一個值的函數。你可能想是這樣的:

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是查詢語言,它的(主要)用於回報東西。對這些元素執行動作通常是一個單獨的步驟。