首页 > 解决方案 > 使用 XDocument.Descendants 获取所有“信号”,但只需要某些“信号”

问题描述

我有一个这样的xml:

<signals>
  <signal name="N$41"></signal>
  <signal name="S$80"></signal>
  <signal name="EPD_PWR">
    <contactref element="HS1" pad="40" />
  </signal>
  ...
</signals>

我通过使用这段代码得到所有的信号:

var result = System.Xml.Linq.XDocument.Load(filename).Descendants("signal");

            foreach (var sig in result)
            {
                signals += sig.Attribute("name").Value.ToString() + " ";
            }
MessageBox.Show(signals);

问题是我只想存储所有具有元素的contactref的“信号”,即“HS1”,如果它们没有contactref或与“HS1”不同的元素名称,则不要存储它们。

如果可能的话,我会怎么做?

标签: c#xml

解决方案


您只需要通过以下方式使用普通的 LINQ 过滤Where

var result = XDocument.Load(filename)
    .Descendants("signal")
    .Where(s => s.Element("contactref")?.Attribute("element")?.Value == "HS1");

然后我还建议使用string.Join来建立你的字符串:

string signals = string.Join(" ", result.Select(s => s.Attribute("EPD_PWR").Value)));

推荐阅读