2012-03-12 63 views
0

XML結構:的LINQ to XML - 避免重複的條目

<Emp> 
<Employee username="John"/>  
<Employee username="Jason"/> 
</Emp> 

我不想通過以下的LINQ to XML查詢

var newEmployee= XElement.Parse(defaultEmployee.ToString()); 
    var q = from p in doc.Descendants("Employee") 
         let attr = p.Attribute("username") 
         where attr != null && attr.Value != txtusername.Text 
         select p; 



    foreach(var dupes in q) 
     { 
     newEmployee.Attribute("username").Value = txtusername.Text ; 
     doc.root.Add(newEmployee); 
     doc.save(EmployeeFile); 
     } 

插入重複屬性的XML文件我正在嘗試添加一個新的員工,但是我的代碼仍然添加了重複項。

有人可以看看我的查詢,讓我知道我在哪裏錯過了邏輯?

+3

顯示的C öde你實際上是*添加*員工 - 我只看到你覆蓋屬性 – BrokenGlass 2012-03-12 20:50:14

+0

只是添加了代碼,我實際上是增加員工 – Macnique 2012-03-12 20:55:29

+0

真的我無法理解你的foreach循環!您將在循環中添加具有相同屬性的太多項目! – 2012-03-12 20:57:23

回答

2

要添加新員工到你的XML沒有環路neccessary,也沒有分析任何默認XML,簡單地說:

doc.Root.Add(new XElement("Employee", 
          new XAttribute("username", txtusername.Text)); 

這我不清楚你的循環是什麼,現在你選擇的任何員工說有一個不同的用戶名,並且對於中的每個,您添加了一個新員工節點 - 這沒什麼意義,我懷疑您只想添加一次新員工。

如果你想檢查另一方面,如果給定用戶名的員工已經存在:

bool userExistsAlready = doc.Descendants("Employee") 
          .Any(x=> (string)x.Attribute("username") == txtusername.Text); 

現在你可以把支票周圍,增加了新員工的代碼:

if(!userExistsAlready) 
{ 
    //add new user 
} 
1

有了這個LINQ查詢可以循環的用戶名屬性,提供不同的操作:

var q = (from p in newEmployee.Descendants("Employee").Attributes("username") 
      select (string)p).Distinct();