2012-01-22 11 views
1

我是新來的LINQ to XML作爲今天的...當它擊中一個空日期字段,雖然我試圖檢查我的select語句空我當前查詢拋出一個錯誤:爲什麼我的linq to xml查詢按設計捕獲空值?

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股票市場數據饋送,並且我期待以給定交易日期,相當自我記錄的形式返回所有符號)。

編輯: 是否表示缺少元素或沒有值的標記?有問題的元素存在但沒有價值。這裏的數據樣本:

<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 - &lt;b&gt;41.00&lt;/b&gt;</LastTradeRealtimeWithTime> 
     <ChangePercentRealtime>N/A - -2.03%</ChangePercentRealtime> 
     <ChangeFromYearHigh>-14.33</ChangeFromYearHigh> 
     <PercebtChangeFromYearHigh>-25.90%</PercebtChangeFromYearHigh> 
     <LastTradeWithTime>Jan 20 - &lt;b&gt;41.00&lt;/b&gt;</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>&amp;nbsp;=====+&amp;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 - &lt;b&gt;10.17&lt;/b&gt;</LastTradeRealtimeWithTime> 
     <ChangePercentRealtime>N/A - -0.10%</ChangePercentRealtime> 
     <ChangeFromYearHigh>-8.30</ChangeFromYearHigh> 
     <PercebtChangeFromYearHigh>-44.94%</PercebtChangeFromYearHigh> 
     <LastTradeWithTime>Jan 20 - &lt;b&gt;10.17&lt;/b&gt;</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>&amp;nbsp;+==-=+&amp;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> 

提前很多感謝..

回答

1

難道說的symbol屬性缺失?

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

感謝道格,但我得到了同樣的錯誤我的評論上面:「字符串未被識別爲有效的DateTime – StatsViaCsh

+0

你能不能從您的XML發佈樣本數據 – Douglas

+0

這是一個在主要問題身體THX? – StatsViaCsh

1

你錯過一些代碼。試試這個:

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

謝謝,我只是跑了...我現在得到錯誤「字符串未被識別爲有效的DateTime。 – StatsViaCsh

+0

嘗試'01/20/2012' –

+0

謝謝馬特,但還沒有。 – StatsViaCsh