我有一个看起来像这样的xml文件,我正在尝试获取表格单元格中的所有位置属性。我设法得到了标题和描述,但不知何故未能获得事件中的所有位置。
有人可以帮我解决这个问题吗?
干杯 特里
到目前为止,我提出的是以下内容
var qListCurrentMonth = (from feed in doc.Descendants("item")
select new
{
title = feed.Element("title").Value,
description = feed.Element("description").Value,
events = (from ev in feed.Element("events").Elements("location")
select new
{
city = ev.Attribute("city")
}).ToList()
});
rptFeedItems.DataSource = qListCurrentMonth;
rptFeedItems.DataBind();
这里是xml
活动 时装秀1
<description>item descr</description>
<link>http://somelink</link>
<events>
<location city="nyc" date="12.12.08" link="http://www.etc.com" />
<location city="nyc" date="25.11.08" link="http://www.etc.com" />
<location city="sfo" date="11.11.08" link="http://www.etc.com" />
<location city="sfo" date="22.01.08" link="http://www.etc.com" />
<location city="dal" date="12.12.08" link="http://www.etc.com" />
</events>
</item>
<item>
<title>Fashion show 2</title>
<description>item descr</description>
<link>http://somelink</link>
<events>
<location city="nyc" date="12.12.08" link="http://www.etc.com" />
<location city="nyc" date="25.11.08" link="http://www.etc.com" />
<location city="sfo" date="11.11.08" link="http://www.etc.com" />
<location city="sfo" date="22.01.08" link="http://www.etc.com" />
<location city="dal" date="12.12.08" link="http://www.etc.com" />
</events>
</item>
这里是转发器
<table border="1">
<asp:Repeater runat="server" ID="rptFeedItems">
<ItemTemplate>
<tr>
<td><%# Eval("title")%></td>
<td><%# Eval("description")%></td>
<td><%# Eval("events")%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
答案 0 :(得分:1)
我猜你得到的是通用List类型而不是元素值。这是因为Eval返回ToString()结果,List上的ToString()返回类型。你可以做几件事。一个是嵌套另一个转发器并将其绑定到events属性。这是理论上最干净的解决方案,尽管在这种情况下我怀疑它是值得的。
您可以做的另一件事是将events属性作为字符串累积。可以这样做:
var qListCurrentMonth =
(from feed in doc.Descendants("item")
select new
{
title = feed.Element("title").Value,
description = feed.Element("description").Value,
events =
(from ev in feed.Element("events").Elements("location")
select ev.Attribute("city").Value).Aggregate((x,y) => x+ "<br />" + y)
});
Aggregate方法将在单个实例中累积集合。如果每行平均有超过5个事件,那么出于性能原因,最好使用StringBuilder作为累加器(存在聚合的重载)(我相信你知道字符串与StringBuilder和性能)。
由于您使用的是.NET 3.5,因此我建议您使用ListView而不是Repeater ...同样在这种情况下,GridView可能会更好,因为你代表一个表。
最后 - 请遵循.NET约定并使用PascalCase作为属性名称(即事件而不是事件)
答案 1 :(得分:1)
如果您只想列出事件单元格中的城市代码:
var qListCurrentMonth =
from feed in doc.Descendants("item")
let cities =
(from location in feed.Element("events").Elements("location")
select location.Attribute("city").Value)
.ToArray())
select new
{
title = feed.Element("title").Value,
description = feed.Element("description").Value,
events = string.Join(", ", cities)
});
Stilgar的聚合方法也是一个很好的建议。