编辑:所以我有一个我需要解析的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()
之前,我花了几分钟时间进行了奇迹和调试。因为我只想要返回一个结果(我也不熟悉通过枚举器)。感谢您的回复,并帮助每个人!
答案 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 => {...});