2012-03-12 34 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();