我有这样的XML
<?xml version="1.0" ?>
<customers>
<customer>
<date>22 Aug 2014</date>
<name>Kevin Anders</name>
<phone>555.555.5555</phone>
</customer>
<customer>
<date>23 Aug 2014</date>
<name>Staci Richard</name>
<phone>555.122.1552</phone>
</customer>
<customer>
<date>25 Aug 2014</date>
</customer>
</customers>
在XML中,缺少某些节点,但每个元素中都存在日期节点。我有大约200个节点,但我想根据日期解析xml,只需要返回前4个日期。例如今天是6月16日然后我的xml获取最新的日期节点并返回接下来三天匹配节点。我能够解析节点,但不知道如何根据日期返回顶级节点
public static IEnumerable<Customer> StreamBooks(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
string name = null;
string phone = null;
reader.MoveToContent();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "customer")
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "name")
{
name = reader.ReadString();
break;
}
}
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "phone")
{
phone = reader.ReadString();
break;
}
}
yield return new Customer() { Name = name, Phone = phone };
}
}
}
}
答案 0 :(得分:1)
我首先删除您当前的代码以检索一系列客户,而只是使用LINQ to XML:
var customers = XDocument.Load(uri)
.Root.Elements("customer")
.Select(x => new Customer {
Date = (DateTime) x.Element("date"),
Name = (string) x.Element("name"),
Phone = (string) x.Element("phone")
});
这要求您将日期格式更改为&#34; yyyy-MM-dd&#34;这是一种标准的XML日期格式。 (所以&#34; 2014-08-23&#34;而不是&#34; 2014年8月23日&#34;例如。)
如果 保留现有的日期格式,您可以使用:
var customers = XDocument.Load(uri)
.Root.Elements("customer")
.Select(x => new Customer {
Date = DateTime.ParseExact(x.Element("date").Value, "d MMM yyyy",
CultureInfo.InvariantCulture),
Name = (string) x.Element("name"),
Phone = (string) x.Element("phone")
});
如果您因其他原因需要整个客户列表,您可能还希望在ToList()
之后添加对Select
的来电。
在此之后,原始数据源是XML的事实无关紧要。然后,您可以使用OrderByDescending
按日期排序最新的第一个,Take
来限制结果:
var recentCustomers = customers.OrderByDescending(c => c.Date)
.Take(4);
LINQ是用于查询数据的非常有用的技术。我强烈建议您了解有关is的更多信息 - 搜索MSDN上的信息,教程等。