2012-09-11 410 views
0
<Category id=1> 
<MyLines> 
     <Line GroupID="0" Cache="15" /> 
    <Rect GroupID="0" Cache="16"/> 
    <Ellipse GroupID="0" Cache="16"/> 
</MyLines> 

Linq查詢,選擇基於屬性值

我的XML文檔包含許多類別標籤的所有節點。你能否讓我知道什麼是最好的方式來獲取緩存= 16的MyLine的每個子元素並將其刪除。

我正在尋找實現這一點使用LINQ。

我試圖如下:

 var q = from node in doc.Descendants("MyLines") 
       let attr = node.Attribute("Cache") 
       where attr != null && Convert.ToInt32(attr.Value) == 16 
       select node; 
     q.ToList().ForEach(x => x.Remove()); 
+3

http://whathaveyoutried.com? StackOverflow不是一個代碼寫入服務 - 我們沒有得到一個開始的支​​付;-) –

+0

請看看我編輯的問題 –

+1

你有什麼特別的理由使用LINQ?對我來說,它看起來像一個XSL轉換是這樣做的... – ChriPf

回答

2

我已經測試了下面的代碼:

string xml =  
@"<Category id=""1""> 
<MyLines> 
    <Line GroupID=""0"" Cache=""15"" /> 
<Rect GroupID=""0"" Cache=""16""/> 
<Ellipse GroupID=""0"" Cache=""16""/> 
</MyLines> 
</Category>"; 

void Main() 
{ 
    var doc = XDocument.Parse(xml); 

    doc.Descendants("MyLines") 
    .Elements() 
    .Where(el => el.Attribute("Cache").Value == "16") 
    .ToList() 
    .ForEach(el => el.Remove()); 

    doc.Root.ToString().Dump(); 
} 

它打印:

<Category id="1"> 
    <MyLines> 
     <Line GroupID="0" Cache="15" /> 
    </MyLines> 
</Category> 

的問題是,你要找的Cache屬性上的MyLines元素而不是MyLines元素的孩子。

+0

它不工作。我錯過了什麼? –

+0

@KishoreBorra,我不知道在我原來的文章中是否有錯別字,但我測試了它並重新發布。嘗試更新的代碼 – smartcaveman

+0

是的。上面的代碼正在工作。但在我的情況下,我有多個類別標籤與父標籤的名稱。它會造成任何問題嗎? –