【问题标题】:Linq query based on attribute基于属性的Linq查询
【发布时间】:2012-02-13 00:38:12
【问题描述】:

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

好的,我有一个 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>

我需要做的是根据id 属性找到&lt;Output&gt; 标签。然后我需要遍历所有&lt;path&gt; 标签并获取属性和路径值。我根据之前提出的问题尝试了一些事情,但我无法让它工作

var results = from c in rootElement.Elements("Output") 
              where (string)c.Attribute("Id") == "2" select c;

foreach (var path in rootElement.Elements("Output").Elements("path"))
{
    string p  = path.Value;
}

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    如果您不实际使用结果,则您的第一行不会做任何事情。

    foreach (var outputElement in rootElement.Elements("Output")
                                             .Where(e => (string)e.Attribute("id") == "1"))
    {
        foreach (var pathElement in outputElement.Elements("path"))
        {
            // ...
        }
    }
    

    如果您的 id 属性保证是唯一的(应该如此),您可以摆脱第一个 foreach 并直接获取单个 &lt;Output&gt;

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

    【讨论】:

      【解决方案2】:

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

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

      确实,有时 XPath 可以让您编写更具可读性和可维护性的代码。您只需使用一些表达式来替换几个 linq-to-xml 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-20
        • 1970-01-01
        • 2019-08-27
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 2011-06-12
        相关资源
        最近更新 更多