C# 基于属性的Linq查询

C# 基于属性的Linq查询,c#,xml,linq,C#,Xml,Linq,遇到了另一个挑战。我浏览了一些我在这里找到的问题,但我似乎无法拼凑出我需要的东西 好的,我有一个XML文件: <Output id="1"> <path rename="Off" name="pattern-1">d:\temp</path> </Output> <Output id="2"> <path isRename="False" name="pattern-1" >d:\temp\ou

遇到了另一个挑战。我浏览了一些我在这里找到的问题,但我似乎无法拼凑出我需要的东西

好的,我有一个XML文件:

<Output id="1">
    <path rename="Off" name="pattern-1">d:\temp</path>
  </Output>

  <Output id="2">
      <path isRename="False" name="pattern-1" >d:\temp\out2</path>
      <path isRename="True"  name="pattern-1" >d:\temp\out3</path>
      <path isRename="False" name="pattern-1">d:\temp\out4</path>
  </Output>

如果你没有实际使用结果,你的第一行就没有任何作用

foreach (var outputElement in rootElement.Elements("Output")
                                         .Where(e => (string)e.Attribute("id") == "1"))
{
    foreach (var pathElement in outputElement.Elements("path"))
    {
        // ...
    }
}
如果您的
id
属性保证是唯一的(它应该是唯一的),您可以去掉第一个foreach,直接获取单个

var outputElement = rootElement.Elements("Output")
                               .FirstOrDefault(e => (string)e.Attribute("id") == "1"));

我建议使用一些XPath来选择您需要的节点:

foreach (XElement path in root.XPathSelectElements("/Output/path[../@id=1]"))
{
    string value = path.Value;
}
事实上,有时XPath可以让您编写更具可读性和可维护性的代码。您只需要使用一些表达式来替换几个linq到xml语句

foreach (XElement path in root.XPathSelectElements("/Output/path[../@id=1]"))
{
    string value = path.Value;
}