C# 为什么我的linq到xml查询不能按设计捕捉空值?
从今天开始,我还不熟悉linq到xml。。。虽然我尝试在select语句中检查空值,但当前查询遇到空值日期字段时会引发错误:C# 为什么我的linq到xml查询不能按设计捕捉空值?,c#,linq-to-xml,C#,Linq To Xml,从今天开始,我还不熟悉linq到xml。。。虽然我尝试在select语句中检查空值,但当前查询遇到空值日期字段时会引发错误: var makeInfo = from s in doc.Descendants("quote") where (s.Element("LastTradeDate") != null) && ((DateTime)s.Element("LastTradeDate") == DateTime.Par
var makeInfo = from s in doc.Descendants("quote")
where (s.Element("LastTradeDate") != null) &&
((DateTime)s.Element("LastTradeDate") == DateTime.Parse("1/20/12"))
select s.Attribute("symbol").Value;
如果有帮助的话,可以使用yql股票市场数据源,我希望返回给定交易日期的所有符号,非常自我记录
编辑:
null是否表示缺少的元素或没有值的标记?有问题的元素存在,但没有值。以下是数据示例:
<quote symbol="A">
<Ask />
<AverageDailyVolume>3788190</AverageDailyVolume>
<Bid />
<AskRealtime>41.09</AskRealtime>
<BidRealtime>40.30</BidRealtime>
<BookValue>12.437</BookValue>
<Change_PercentChange>-0.85 - -2.03%</Change_PercentChange>
<Change>-0.85</Change>
<Commission />
<ChangeRealtime>-0.85</ChangeRealtime>
<AfterHoursChangeRealtime>N/A - N/A</AfterHoursChangeRealtime>
<DividendShare>0.00</DividendShare>
<LastTradeDate>1/20/2012</LastTradeDate>
<TradeDate />
<EarningsShare>2.85</EarningsShare>
<ErrorIndicationreturnedforsymbolchangedinvalid />
<EPSEstimateCurrentYear>3.18</EPSEstimateCurrentYear>
<EPSEstimateNextYear>3.47</EPSEstimateNextYear>
<EPSEstimateNextQuarter>0.79</EPSEstimateNextQuarter>
<DaysLow>40.68</DaysLow>
<DaysHigh>41.90</DaysHigh>
<YearLow>28.67</YearLow>
<YearHigh>55.33</YearHigh>
<HoldingsGainPercent>- - -</HoldingsGainPercent>
<AnnualizedGain />
<HoldingsGain />
<HoldingsGainPercentRealtime>N/A - N/A</HoldingsGainPercentRealtime>
<HoldingsGainRealtime />
<MoreInfo>cnsprmiIed</MoreInfo>
<OrderBookRealtime />
<MarketCapitalization>14.273B</MarketCapitalization>
<MarketCapRealtime />
<EBITDA>1.326B</EBITDA>
<ChangeFromYearLow>+12.33</ChangeFromYearLow>
<PercentChangeFromYearLow>+43.01%</PercentChangeFromYearLow>
<LastTradeRealtimeWithTime>N/A - <b>41.00</b></LastTradeRealtimeWithTime>
<ChangePercentRealtime>N/A - -2.03%</ChangePercentRealtime>
<ChangeFromYearHigh>-14.33</ChangeFromYearHigh>
<PercebtChangeFromYearHigh>-25.90%</PercebtChangeFromYearHigh>
<LastTradeWithTime>Jan 20 - <b>41.00</b></LastTradeWithTime>
<LastTradePriceOnly>41.00</LastTradePriceOnly>
<HighLimit />
<LowLimit />
<DaysRange>40.68 - 41.90</DaysRange>
<DaysRangeRealtime>N/A - N/A</DaysRangeRealtime>
<FiftydayMovingAverage>36.4185</FiftydayMovingAverage>
<TwoHundreddayMovingAverage>37.0112</TwoHundreddayMovingAverage>
<ChangeFromTwoHundreddayMovingAverage>+3.9888</ChangeFromTwoHundreddayMovingAverage>
<PercentChangeFromTwoHundreddayMovingAverage>+10.78%</PercentChangeFromTwoHundreddayMovingAverage>
<ChangeFromFiftydayMovingAverage>+4.5815</ChangeFromFiftydayMovingAverage>
<PercentChangeFromFiftydayMovingAverage>+12.58%</PercentChangeFromFiftydayMovingAverage>
<Name>Agilent Technolog</Name>
<Notes />
<Open>41.77</Open>
<PreviousClose>41.85</PreviousClose>
<PricePaid />
<ChangeinPercent>-2.03%</ChangeinPercent>
<PriceSales>2.20</PriceSales>
<PriceBook>3.36</PriceBook>
<ExDividendDate>1-Nov-06</ExDividendDate>
<PERatio>14.68</PERatio>
<DividendPayDate>Apr 25</DividendPayDate>
<PERatioRealtime />
<PEGRatio>0.85</PEGRatio>
<PriceEPSEstimateCurrentYear>13.16</PriceEPSEstimateCurrentYear>
<PriceEPSEstimateNextYear>12.06</PriceEPSEstimateNextYear>
<Symbol>A</Symbol>
<SharesOwned />
<ShortRatio>1.00</ShortRatio>
<LastTradeTime>4:00pm</LastTradeTime>
<TickerTrend>&nbsp;=====+&nbsp;</TickerTrend>
<OneyrTargetPrice>48.57</OneyrTargetPrice>
<Volume>3906432</Volume>
<HoldingsValue />
<HoldingsValueRealtime />
<YearRange>28.67 - 55.33</YearRange>
<DaysValueChange>- - -2.03%</DaysValueChange>
<DaysValueChangeRealtime>N/A - N/A</DaysValueChangeRealtime>
<StockExchange>NYSE</StockExchange>
<DividendYield />
<PercentChange>-2.03%</PercentChange>
</quote>
<quote symbol="AA">
<Ask />
<AverageDailyVolume>30981100</AverageDailyVolume>
<Bid />
<AskRealtime>10.27</AskRealtime>
<BidRealtime>9.15</BidRealtime>
<BookValue>13.966</BookValue>
<Change_PercentChange>-0.01 - -0.10%</Change_PercentChange>
<Change>-0.01</Change>
<Commission />
<ChangeRealtime>-0.01</ChangeRealtime>
<AfterHoursChangeRealtime>N/A - N/A</AfterHoursChangeRealtime>
<DividendShare>0.12</DividendShare>
<LastTradeDate>1/20/2012</LastTradeDate>
<TradeDate />
<EarningsShare>0.953</EarningsShare>
<ErrorIndicationreturnedforsymbolchangedinvalid />
<EPSEstimateCurrentYear>0.57</EPSEstimateCurrentYear>
<EPSEstimateNextYear>0.96</EPSEstimateNextYear>
<EPSEstimateNextQuarter>0.12</EPSEstimateNextQuarter>
<DaysLow>10.06</DaysLow>
<DaysHigh>10.2075</DaysHigh>
<YearLow>8.45</YearLow>
<YearHigh>18.47</YearHigh>
<HoldingsGainPercent>- - -</HoldingsGainPercent>
<AnnualizedGain />
<HoldingsGain />
<HoldingsGainPercentRealtime>N/A - N/A</HoldingsGainPercentRealtime>
<HoldingsGainRealtime />
<MoreInfo>cnsprmiIed</MoreInfo>
<OrderBookRealtime />
<MarketCapitalization>10.824B</MarketCapitalization>
<MarketCapRealtime />
<EBITDA>3.610B</EBITDA>
<ChangeFromYearLow>+1.72</ChangeFromYearLow>
<PercentChangeFromYearLow>+20.36%</PercentChangeFromYearLow>
<LastTradeRealtimeWithTime>N/A - <b>10.17</b></LastTradeRealtimeWithTime>
<ChangePercentRealtime>N/A - -0.10%</ChangePercentRealtime>
<ChangeFromYearHigh>-8.30</ChangeFromYearHigh>
<PercebtChangeFromYearHigh>-44.94%</PercebtChangeFromYearHigh>
<LastTradeWithTime>Jan 20 - <b>10.17</b></LastTradeWithTime>
<LastTradePriceOnly>10.17</LastTradePriceOnly>
<HighLimit />
<LowLimit />
<DaysRange>10.06 - 10.2075</DaysRange>
<DaysRangeRealtime>N/A - N/A</DaysRangeRealtime>
<FiftydayMovingAverage>9.3315</FiftydayMovingAverage>
<TwoHundreddayMovingAverage>11.206</TwoHundreddayMovingAverage>
<ChangeFromTwoHundreddayMovingAverage>-1.036</ChangeFromTwoHundreddayMovingAverage>
<PercentChangeFromTwoHundreddayMovingAverage>-9.25%</PercentChangeFromTwoHundreddayMovingAverage>
<ChangeFromFiftydayMovingAverage>+0.8385</ChangeFromFiftydayMovingAverage>
<PercentChangeFromFiftydayMovingAverage>+8.99%</PercentChangeFromFiftydayMovingAverage>
<Name>Alcoa Inc. Common</Name>
<Notes />
<Open>10.14</Open>
<PreviousClose>10.18</PreviousClose>
<PricePaid />
<ChangeinPercent>-0.10%</ChangeinPercent>
<PriceSales>0.44</PriceSales>
<PriceBook>0.73</PriceBook>
<ExDividendDate>Nov 2</ExDividendDate>
<PERatio>10.68</PERatio>
<DividendPayDate>Nov 25</DividendPayDate>
<PERatioRealtime />
<PEGRatio>0.80</PEGRatio>
<PriceEPSEstimateCurrentYear>17.86</PriceEPSEstimateCurrentYear>
<PriceEPSEstimateNextYear>10.60</PriceEPSEstimateNextYear>
<Symbol>AA</Symbol>
<SharesOwned />
<ShortRatio>2.30</ShortRatio>
<LastTradeTime>4:00pm</LastTradeTime>
<TickerTrend>&nbsp;+==-=+&nbsp;</TickerTrend>
<OneyrTargetPrice>11.71</OneyrTargetPrice>
<Volume>23356074</Volume>
<HoldingsValue />
<HoldingsValueRealtime />
<YearRange>8.45 - 18.47</YearRange>
<DaysValueChange>- - -0.10%</DaysValueChange>
<DaysValueChangeRealtime>N/A - N/A</DaysValueChangeRealtime>
<StockExchange>NYSE</StockExchange>
<DividendYield>1.18</DividendYield>
<PercentChange>-0.10%</PercentChange>
</quote>
非常感谢您。是否缺少符号属性
var makeInfo =
from s in doc.Descendants("quote")
where s.Element("LastTradeDate") != null
&& (DateTime)s.Element("LastTradeDate") == DateTime.Parse("1/20/12")
&& s.Attribute("symbol") != null
select s.Attribute("symbol").Value;
编辑:如果您的日期始终遵循美国格式MM/dd/yy,您可以尝试:
CultureInfo enUS = new CultureInfo("en-US");
DateTime targetDate = new DateTime(2012, 1, 20);
var makeInfo =
from s in doc.Descendants("quote")
where s.Element("LastTradeDate") != null
&& s.Attribute("symbol") != null
let dateStr = s.Element("LastTradeDate").Value
where !string.IsNullOrEmpty(dateStr)
&& DateTime.Parse(dateStr, enUS) == targetDate
select s.Attribute("symbol").Value;
您缺少一点代码。试试这个:
var makeInfo = from s in doc.Descendants("quote")
where (s.Element("LastTradeDate").Value != null) &&
((DateTime)s.Element("LastTradeDate").Value == DateTime.Parse("1/20/12"))
select s.Attribute("symbol").Value;
谢谢,我刚刚跑了。。。我现在得到的错误字符串未被识别为有效的日期时间。谢谢Doug,但我得到的错误与我上面的评论相同:字符串未被识别为有效的日期时间。您可以发布XML中的示例日期吗?