2012-02-28 88 views
1

我是很新,使用LINQ所以我不能完全确定所有正确的语法等XML 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> 

我得到这个由一家外部公司控制的网络服务,所以我无法改变语法

这里的LINQ我用了我的.Net代码

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 

基本上我想选择是今天的日期之前的所有航班,只是似乎无法得到这个工作。

任何帮助,将不胜感激

+2

仅供参考,您可以在加载String时使用XElement.Parse()而不是Load。 – DaveShaw 2012-02-28 14:11:56

回答

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); 
} 
+0

谢谢 - 我已经得到了这个工作 - 我将您的工作代码转换为VB,并且语句的WHERE部分中的语法不同 – 2012-02-28 15:00:23