【问题标题】:How to check if specific attribute exists in XML using Linq如何使用 Linq 检查 XML 中是否存在特定属性
【发布时间】:2020-11-06 13:46:37
【问题描述】:

我创建了一个用于与 Arduinos 通信的 WPF 程序。 在我的应用中有多个按钮来切换端口。

为了处理按钮,我创建了一个简单的格式:

  1. 每个按钮都有一个特定的名称,例如“Button1”
  2. 系统中的每个 Arduino 都有一个唯一的地址,例如“2”
  3. 然后是 Arduino 的端口,例如“5”

现在我想使用 Linq 将地址和端口号保存在 XML 文件中:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <Buttondata btnName="Button1">
    <ardAdress>2</ardAdress>
    <pinNumber>5</pinNumber>
  </Buttondata>
  <Buttondata btnName="Button2">
    <ardAdress>3</ardAdress>
    <pinNumber>10</pinNumber>
  </Buttondata>
  <Buttondata btnName="Button3">
    <ardAdress>1</ardAdress>
    <pinNumber>6</pinNumber>
  </Buttondata>
</root>
...

这是保存的代码:

private void savetoXML()
  {
      XElement newElement = XElement.Load("Savedata.xml");
                newElement.Add(new XElement("Buttondata", 
                                              new XAttribute("btnName", ButtonName),
                                                   new XElement("ardAdress", result1),
                                                   new XElement("pinNumber", result2)));
      newElement.Save("Savedata.xml");
  }

到目前为止,这工作正常,但现在我想检查按钮是否已经存在,如果存在,只需更改地址和密码。

我在想这样的事情:

private void savetoXML()
  {
    // check if button already exists
       if (button exists == true)
       {
         //change only adress and pin number of button
       }
       else (button exists == false)
       {
         //create new xml-Element for button
       }
  }

我已经用一些代码 sn-ps 尝试过,但从未让它正常工作。

“ButtonName”-字符串告诉我,哪个按钮已被按下或者需要更新。 谁能给我一个提示如何处理属性“btnName”以查看“ButtonName”是否已经存在?

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    经过一些额外的搜索,我想出了以下代码:

    private void SavetoXML()
            {
                XElement newElement = XElement.Load("Savedata.xml");
                
                var result = (from ele in newElement.Descendants("Buttondata")
                              .Where(x => (string)x.Attribute("btnName") == ButtonName)
                              select ele).ToList();
              //if there´s an element in the list then override existing adress & pin
                if (result.Attributes("btnName").Count() == 1) 
                {
                    //Console.WriteLine("existing");
                    var items = from item in newElement.Elements("Buttondata")
                                where item != null && (item.Attribute("btnName").Value == ButtonName)
                                select item;
    
                    foreach (var item in items)
                    {
                        //assign new value to the sub-element author
                        item.Element("ardAdress").Value = result1;
                        item.Element("pinNumber").Value = result2;
                        newElement.Save("Savedata.xml");
                    }
                }
              //if there´s no element in the list then create new
                else if (result.Attributes("btnName").Count() == 0)
                {
                    Console.WriteLine("create new");
                    newElement.Add(new XElement("Buttondata",
                                                  new XAttribute("btnName", ButtonName),
                                                       new XElement("ardAdress", result1),
                                                       new XElement("pinNumber", result2)));
                    newElement.Save("Savedata.xml");
                }
            }
    
    

    请注意,我是一个绝对的初学者。也许有更好的解决方案。

    【讨论】:

      【解决方案2】:

      尝试将结果放入字典中。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Linq;
      namespace ConsoleApplication1
      {
          class Program
          {
              const string FILENAME = @"c:\temp\test.xml";
              static void Main(string[] args)
              {
                  XDocument doc = XDocument.Load(FILENAME);
      
                  Dictionary<string, Button> dict = doc.Descendants("Buttondata")
                      .Select(x => new Button()
                      {
                          name = (string)x.Attribute("btnName"),
                          addrress = (int)x.Element("ardAdress"),
                          number = (int)x.Element("pinNumber")
                      }).GroupBy(x => x.name, y => y)
                      .ToDictionary(x => x.Key, y => y.FirstOrDefault());
      
                  Button button = dict["Button2"];
              }
          }
          public class Button
          {
              public string name { get; set; }
              public int addrress { get; set; }
              public int number { get; set; }
          }
      }
      

      【讨论】:

      • 谢谢,我也试试!
      猜你喜欢
      • 2011-11-03
      • 2023-03-18
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多