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,那么它将创建另一个客户端部分,这没关系,但我想要的是:
- 如果不存在,请创建新的客户端部分。
- 如果Client存在,则向其添加 ServName,而不是替换已有的ServName。
- 如果客户端上已存在服务,则不执行任何操作,因为已存在。
任何线索? 我从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的可能性,你必须在某些时候检查它们。