我只是想了解Linq,我正在尝试做一些看起来很简单的事情,但我无法按照自己的意愿去输出结果。我一直坚持这个尝试各种不同方法的日子,我无法做到。使用Linq从列表构建XML <CustomClass>
所以我有一个类EarObs,它有成员:eventID,icaoId,frm,sta,db。
我想从列表中创建一个XML文档。我想在XML文档看起来像这样:
<EarObs EventId = "123456789">
<icao icaoID = "0001">
<frm frm = "01">
<sta sta = "00">
<db>87</db>
<hz>99</hz>
</sta>
<sta station = "01">
<db>79</db>
<hz>99</hz>
</sta>
</frm>
<frm frm = "02">
................
</frm>
</icao>
</EarObs>
,这将继续一路下跌保持相同的订单,如果有不止一个帧或多个代码等
所以这是我最近一直在尝试,但它仍然没有输出他们想要的方式,Obs重复,我不知道我错在哪里。
string eventGUID = "eventGUID";
List<EarObs> frameObsList = new List<EarObs>();
for (int frm = 2; frm > 0; frm--)
{
for (int sta = 5; sta > 0; sta--)
{
frameObsList.Add(new EarObs("KAPF", eventGUID, frm, sta, 85 + sta, 99 + sta));
cnt++;
}
}
String eventID = obsList.First().EventGUID;
List<EarObs> distinctApts =
obsList
.GroupBy(p => p.IcaoId)
.Select(g => g.First())
.ToList();
XElement xElement = new XElement("EarObs", new XAttribute("eventID", eventID),
from ea in distinctApts
orderby ea.IcaoId
select new XElement("icao", new XAttribute("code", ea.IcaoId),
from eb in obsList
where ea.IcaoId == eb.IcaoId
orderby eb.Frm
select new XElement("frm", new XAttribute("frm", eb.Frm),
from ec in obsList
where eb.Frm == ec.Frm
orderby ec.Sta
select new XElement("sta", new XAttribute("sta", ec.Sta),
new XElement("db", ec.Db),
new XElement("hz", ec.Hz)))));
使用此代码我得到一个XML文件,为每个站重复一次帧。这是不正确的。我觉得这很容易顺序完成,但我试图学习,这似乎很简单,我应该可以在Linq中完成。我需要列表中的每个元素只能在XML文档中表示一次。我如何去做这件事?
我也想扩展它,以便它可以处理多个eventId,但这不像获得XML结构正确那么重要。任何帮助将不胜感激,我还没有找到太多创建XML的例子,包括使用linq过滤元素,大多数例子似乎都在创建XML之前将所有的列表都准备好了。
它可能不是“正确的”,但它完全按照指示进行 - 您在循环播放站时为每次迭代添加一个对象。您可能想要的是将电台添加到本地收藏,然后添加一个包含电台收藏的帧。 – GalacticCowboy 2013-02-15 20:07:54
那你是说我应该在选择的sta元素行下添加另一条语句吗?您能否通过将电台添加到本地收藏中来详细说明您的意思? – Ben 2013-02-15 20:17:09
比这更早,当您构建frameObsList时,您为每个站添加一个。 – GalacticCowboy 2013-02-15 20:27:47