C#Linq对XML进行添加,更新,删除

我有这个代码

XElement newClient= new XElement("Client", new XElement("Name", cmbClient.Text), new XElement("Service", new XElement("ServName", cmbService.Text))); xmlDoc.Add(newClient); xmlDoc.Save("Settings.xml"); 

这创造了这个

    Client Name  Service Name    

如果我再次按下Button1,那么它将创建另一个客户端部分,这没关系,但我想要的是:

  1. 如果存在,请创建新的客户端部分。
  2. 如果Client存在,则向其添加 ServName,而不是替换已有的ServName。
  3. 如果客户端上已存在服务,则不执行任何操作,因为已存在。

任何线索? 我从linq开始到xml …感谢您的建议!

编辑:解决方案由mixin Dmitry Dovgopoly和Leon Newswanger提供答案谢谢你们两位! :d

 XDocument xDoc = XDocument.Load("Settings.xml"); var Clients = from client in xDoc.Root.Elements("Client") where client.Element("Name").Value == cmbClient.Text select client; if (Clients.Count() > 0) { var Client = (from client in xDoc.Root.Elements("Client") where client.Element("Name").Value == cmbClient.Text select client).Single(); if (Client.Element("Services").Elements().Count(el => el.Value == cmbService.Text) == 0) { Client.Element("Services").Add(new XElement("ServName", cmbService.Text)); } } else { XElement newClient = new XElement("Client", new XElement("Name", cmbClient.Text), new XElement("Services", new XElement("ServName", cmbService.Text))); xDoc.Root.Add(newClient); } xDoc.Save("Settings.xml"); 

您可以使用XElement.Element(name)方法获取特定元素,或使用XElement.Elements()枚举所有元素。

 if (xmlDoc.Elements("Client").Count() == 0) { //Client section does not exist. We add new section. XElement newClient = new XElement("Client", new XElement("Name", mbClient.Text), new XElement("Service", new XElement("ServName", cmbService.Text))); xmlDoc.Add(newClient); } else //Client section exists. { //obtain  section XElement service = xmlDoc.Element("Client").Element("Service"); if (service.Elements().Count(el => el.Value == cmbService.Text) == 0) { //there is no service with name cmbService.Text. We add one. service.Add(new XElement("ServName", cmbService.Text)); } } 

根本没有测试,但应该工作。

  System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); xmlDoc.Load("Settings.xml"); if (xmlDoc.SelectNodes("/Clients/Client").Count <= 0) { XElement newClient = new XElement("Client", new XElement("Name", cmbClient.Text), new XElement("Service", new XElement("ServName", cmbService.Text))); xmlDoc.Add(newClient); xmlDoc.Save("Settings.xml"); } else { //find Service tag and add a new child element here } 

你可以尝试:

 bool checkClientElement = xmlDoc.Descendants("Client").Any(); if (!checkClientElement) { XElement newClient= new XElement("Client", new XElement("Name", mbClient.Text), new XElement("Service", new XElement("ServName", cmbService.Text))); xmlDoc.Add(newClient); xmlDoc.Save("Settings.xml"); } 

这是经过测试和运作的:

  XDocument xDoc = XDocument.Load("Settings.xml"); var Clients = from client in xDoc.Root.Elements("Client") where client.Element("Name").Value == cmbClient.Text select client; if (Clients.Count() > 0) { var Client = (from client in xDoc.Root.Elements("Client") where client.Element("Name").Value == cmbClient.Text select client).Single(); if (Client.Elements("Services").Count() == 0) { Client.Add( new XElement("Services", new XElement("Service", cmbService.Text))); } } else { XElement newClient = new XElement("Client", new XElement("Name", cmbClient.Text), new XElement("Services", new XElement("ServName", cmbService.Text))); xDoc.Root.Add(newClient); } xDoc.Save("Settings.xml"); 

注意:如果cmbService为null,它仍将创建服务,但作为空标记。 如果你打算使用它来读取和写入null的可能性,你必须在某些时候检查它们。