我很擅长使用LINQ,所以我不完全确定所有正确的语法等。
这是我到目前为止所得到的
我的XML
<?xml version="1.0"?>
<Bookings>
<Booking BookingNumber="300067649">
<FLIGHTS>
<FlightGroups>
<FlightGroup ID="1 ">
<Flights>
<Flight ID="1">
<ADULTS>1</ADULTS>
<DEPARTURE_DATE>18/02/2006</DEPARTURE_DATE>
</Flight>
</Flights>
</FlightGroup>
</FlightGroups>
</FLIGHTS>
</Booking>
</Bookings>
我是从外部公司控制的网络服务获得的,所以我无法更改语法
这是我在.Net代码中使用的LINQ
Dim root As XElement = XElement.Load(New StringReader(xmlstring))
Dim tests As IEnumerable(Of XElement) = From el In
root.Elements("Booking").Elements("FLIGHTS").Descendants()
Where CType(el.Element("DEPARTURE_DATE"), DateTime).Date <= DateTime.Now.Date
For Each el As XElement In tests
Response.Write(el)
Next
字符串xmlstring
是上面的XML。
问题是这给了我一个错误:
Value cannot be null.
Parameter name: element
基本上我正在尝试选择今天之前的所有航班,但似乎无法让它发挥作用。
任何帮助将不胜感激
答案 0 :(得分:1)
根据您当前的文化情况,18/02/2006
可能无法转换为DateTime
(该月的前一天。如果您在美国,则该月份应该在当天之前)。
这会引发错误(我在美国)。
var d1 = DateTime.Parse("18/02/2006");
这有效:
var d2 = DateTime.Parse("02/18/2006");
我刚刚尝试了下面的测试,一切都按预期工作(我更改了日期的格式)。您可能必须提供格式提供程序来转换日期。
var str = @"<?xml version=""1.0""?>
<Bookings>
<Booking BookingNumber=""300067649"">
<FLIGHTS>
<FlightGroups>
<FlightGroup ID=""1"">
<Flights>
<Flight ID=""1"">
<ADULTS>1</ADULTS>
<DEPARTURE_DATE>02/18/2006</DEPARTURE_DATE>
</Flight>
</Flights>
</FlightGroup>
</FlightGroups>
</FLIGHTS>
</Booking>
</Bookings>
";
var xel = System.Xml.Linq.XElement.Parse(str);
var flights = xel.Descendants("Flight");
var tests = flights.Where(f => DateTime.Parse(f.Element("DEPARTURE_DATE").Value).Date < DateTime.Now.Date);
foreach (var test in tests)
{
System.Console.WriteLine(test.Element("DEPARTURE_DATE").Value);
}