我怎样才能在Linq得到后代的后代?

时间:2015-01-16 10:12:49

标签: c# xml linq

编辑:所以我有一个我需要解析的XML文件。经过研究,我已经能够获得第一组没有问题的节点,我真的很喜欢我可以返回它们的方式。

我已经能够得到<Project>的直接孩子。但是获得下一个后代(<tree>&amp; <branch)并不是那么富有成效,我最终决定自己去谷歌和R + D之后......如果可能的话,我会这样做喜欢使用类似的类样式输出,如下所示,即使代码重新构建。

XML结构

<Projects>
 <Project AccessTag="">
  <Title></Title>
  <ReaderURL></ReaderURL>
  <Status></Status>
  <tree>
   <branch></branch>
  </tree>
 </Project>
</Projects>

代码

XDocument xml = XDocument.Load(this.XMLFile);
var project = (
  from p in xml.Descendants("Project")
  where p.Attribute("AccessTag").Value == Trigger
  select new {
    title = p.Element("Title").Value,
    reader = p.Element("ReaderURL").Value,
    status = p.Element("Status").Value
    }).Single();
// output is project.title, project.reader, etc

修改:完成我所做的所有研究以及基于以下答案的变体后,我完成的代码现在如下所示,并返回类似于var的{​​{1}}结果。进一步完成项目后。我最终将许多class<tree>元素作为父<branch>元素的子节点。每个树元素具有唯一的数字属性。

<Project>

如下所述,在我记得在第二个XDocument xml = XDocument.Load(this.XMLFile); var resulted = xml.Descendants("Project") .Where(a => (string)a.Attribute("AccessTag") == Trigger) .Select(a => new { Title = (string)a.Element("Title"), ReaderURL = (string)a.Element("ReaderURL"), Status = (string)a.Element("Status"), Tree = a.Elements("tree") .Where(b => (string)b.Attribute("number") == Num) .Select(b => new {...}).Single() }).FirstOrDefault(); 子句中使用.Single()之前,我花了几分钟时间进行了奇迹和调试。因为我只想要返回一个结果(我也不熟悉通过枚举器)。感谢您的回复,并帮助每个人!

3 个答案:

答案 0 :(得分:2)

你需要这样做:

from p in xml.Descendants("Project")
from t in p.Descendants("tree") // selecting descendant node tree of Project
  where p.Attribute("AccessTag").Value == Trigger
  select new {
    title = p.Element("Title").Value,
    reader = p.Element("ReaderURL").Value,
    status = p.Element("Status").Value,
    branch = t.Element("branch").Value // select value here
    }).Single();

答案 1 :(得分:2)

试试这个: -

var result = xml.Descendants("Project")
           .Where(x => (string)x.Attribute("AccessTag") == "Trigger")
           .Select(x => new
  {
     Title = (string)x.Element("Title"),
     ReaderURL = (string)x.Element("ReaderURL"),
     Status = (string)x.Element("Status"),
     Branch = x.Descendants("tree") //Here are fetching the Descendants
              .Select(z => (string)z.Element("branch")).FirstOrDefault()
   }).FirstOrDefault();

请注意我在提取FirstOrDefault时正在使用Branch,因为我认为您只需要第一个分支元素,如果不是这样,请将FirstOrDefault替换为ToList(),它将会返回所有分支元素。

答案 2 :(得分:0)

你可以使用元素而不是后代......

var root = xml.Element("Projects").Element("Project")
              .Where(x => (string)x.Attribute("AccessTag") == "Trigger")
              .Select(x => {...});