首页 > 解决方案 > 如何使用 Linq 检查 XML 中是否存在特定属性

问题描述

我创建了一个用于与 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
       }
  }

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

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

标签: c#xmllinq

解决方案


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

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

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


推荐阅读