基于属性的Linq查询。

4

我遇到了另一个挑战。我看过这里发现的一些问题,但似乎无法将我需要的东西拼凑起来。

好的,我有一个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属性找到<Output>标签。然后我需要遍历所有<path>标签并获取属性和路径值。基于我之前提出的问题,我尝试了一些方法,但无法让它正常工作。
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;
}
2个回答

1

如果你不实际使用结果,那么你的第一行代码就没有任何作用。

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

如果你的id属性保证是唯一的(这是应该的),你可以摆脱第一个foreach,直接获取单独的<Output>

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

0
我建议使用XPath来选择您需要的节点:
foreach (XElement path in root.XPathSelectElements("/Output/path[../@id=1]"))
{
    string value = path.Value;
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接