XML Linq查询无法正常工作

时间:2012-02-28 14:08:37

标签: asp.net xml linq

我很擅长使用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

基本上我正在尝试选择今天之前的所有航班,但似乎无法让它发挥作用。

任何帮助将不胜感激

1 个答案:

答案 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);
}