C#Linq到XML添加、更新、删除

C#Linq到XML添加、更新、删除,c#,xml,linq,C#,Xml,Linq,我有这个密码 XElement newClient= new XElement("Client", new XElement("Name", cmbClient.Text), new XElement("Service", new XElement("ServName", cmbService.Text))); xmlDoc.Add(newClient); xmlDoc

我有这个密码

        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");
这是什么造成的

<?xml version="1.0" encoding="utf-8"?>
<Clients>
  <Client>
    <Name>Client Name</Name>
    <Services>
      <ServName>Service Name</ServName>
    </Services>
  </Client>
</Clients>

根本没有经过测试,但应该可以工作

  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
            }
System.Xml.XmlDocument xmlDoc=new System.Xml.XmlDocument();
Load(“Settings.xml”);
如果(xmlDoc.SelectNodes(“/Clients/Client”).Count您可以尝试:

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");
}

您可以使用
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 <service> 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));
    }
}
if(xmlDoc.Elements(“客户端”).Count()=0)
{
//客户端节不存在。我们添加了新节。
XElement newClient=新XElement(“客户端”,
新XElement(“名称”,mbClient.Text),
新XElement(“服务”,
新XElement(“ServName”,cmbService.Text));
xmlDoc.Add(newClient);
}
else//客户端部分存在。
{
//获取部分
XElement服务=xmlDoc.Element(“客户端”).Element(“服务”);
if(service.Elements().Count(el=>el.Value==cmbService.Text)==0)
{ 
//没有名为cmbService.Text的服务。我们添加了一个。
添加(新的XElement(“ServName”,cmbService.Text));
}
}

这是经过测试和工作的:

    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的内容,您必须在某个时候检查它们。

XElement xmlDoc=XElement.Load(“settings.xml”);无法使其工作,因为XmlDocument无法使用。Add方法。将linq2xml与XmlDocumentAk混合使用时,假定xmlDoc是XmlDocument类型,而不是XElement。只需像原始示例中那样使用和XElement。这仅检查是否存在任何子元素,以及它是否添加了任何子元素。如果存在任何现有客户端,则不会添加任何。它也不会修改现有客户端。@DmitryDovgopoly我意识到这一点,但从问题的上下文来看,将其作为XDocument打开会更有意义,因为内容直接来自文件。它不起作用,它会创建一个新客户端和一个新服务(如果它不存在),但如果我尝试向我的客户端添加另一个服务,则什么也没有hapens…@user1381537很抱歉,我一定误解了这个问题。我假设每个客户端只有一个服务。在进行修改之前,让我确保我理解您的目标。如果客户端存在,而服务不存在,则您希望添加服务。如果客户端存在,则该客户端的服务也存在,不执行任何操作,因为它存在。如果客户端不存在,请添加新的客户端条目。是否正确?
    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");