3

私はこのコードを持っています

        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>

Button1をもう一度押すと、別のクライアントセクションが作成されます。これで問題ありませんが、必要なのは次のとおりです。

  1. 存在しない場合は、新しいクライアントセクションを作成します。
  2. クライアントが存在する場合は、既存のものを置き換えるのではなく、ServNameをクライアントに追加します。
  3. サービスがクライアントにすでに存在する場合は、すでに存在するため、何もしません。

どんな手掛かり?linq to xmlから始めています...アドバイスに感謝します!

編集:DmitryDovgopolyとLeonNewswangerからのミックスインの回答によって提供されるソリューションは2人に感謝します!: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");
4

4 に答える 4

3

メソッドを使用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));
    }
}
于 2012-11-08T14:37:11.137 に答える
1

まったくテストされていませんが、動作するはずです。

  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
            }
于 2012-11-08T12:54:55.933 に答える
1

あなたは試すことができます:

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");
}
于 2012-11-08T13:18:54.843 に答える
1

これはテストされ、機能しています。

    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の可能性がある読み取りと書き込みを行う場合は、ある時点でnullをチェックする必要があります。

于 2012-11-08T17:55:42.877 に答える