C# 我的LINQ到XML查询中的格式错误

C# 我的LINQ到XML查询中的格式错误,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我正试图解决通过yql从yahoo finance返回的股票市场数据的LINQ到XML查询的难题。有几个字段的数据格式不正确或值为空。我当前的错误是: 输入字符串的格式不正确 我已经为我感兴趣的每个元素添加了一个检查null,但是错误仍然存在 如果有帮助,则引发异常的突出显示的代码部分是包含我的数据点对象的新初始化的块。如果XML通过了查询中的检查,则在初始化DailyPricingVolDP时将null传递给构造函数时会抛出错误 0.89 6523 0.67 0.89 0.67 4.804 0

我正试图解决通过yql从yahoo finance返回的股票市场数据的LINQ到XML查询的难题。有几个字段的数据格式不正确或值为空。我当前的错误是:

输入字符串的格式不正确

我已经为我感兴趣的每个元素添加了一个检查null,但是错误仍然存在

如果有帮助,则引发异常的突出显示的代码部分是包含我的数据点对象的新初始化的块。如果XML通过了查询中的检查,则在初始化DailyPricingVolDP时将null传递给构造函数时会抛出错误

0.89 6523 0.67 0.89 0.67 4.804 0.00 - 0.00% 0 0 不适用-不适用 0 1/25/2012 -4.491 0 0 0 0.42 2.95 - - - 不适用-不适用 CNPRMIED 920万 -34.5米 +0.18 +42.86% 不适用-b0.60/b 不适用-0.00% -2.35 -79.66% 1月25日至0.60/b 0.60 不适用-不适用 不适用-不适用 0.5639 1.4051 -0.8051 -57.30% +0.0361 +6.39% 肯定性保险 0.60 0.00% 0.03 0.12 2008年12月12日 2008年12月31日 AFFM 0.20 下午1:34 &;nbsp======&;nbsp; 6 200 0.42 - 2.95 - - 0.00% 不适用-不适用 纳斯达克纳米 0.00% 这个

不会做你认为它会做的事。如果有一个元素处于打开状态,即使看起来与示例中的相同,该条件也是真的。元素Open存在,且不为null。它只是没有值,或者准确地说,它有空字符串的值,-这导致了格式异常

在where子句中,您应该将条件更改为

s.Element("Volume").Value != ""
以防止解析空值元素的尝试

举个简单的例子。这个小程序打印什么

var xDoc = XDocument.Parse("<quote><Open /></quote>");
var open = xDoc.Descendants("quote").First().Element("Open");
Console.WriteLine(open == null);
Console.WriteLine(open);
对。False后跟

这个

不会做你认为它会做的事。如果有一个元素处于打开状态,即使看起来与示例中的相同,该条件也是真的。元素Open存在,且不为null。它只是没有值,或者准确地说,它有空字符串的值,-这导致了格式异常

在where子句中,您应该将条件更改为

s.Element("Volume").Value != ""
以防止解析空值元素的尝试

举个简单的例子。这个小程序打印什么

var xDoc = XDocument.Parse("<quote><Open /></quote>");
var open = xDoc.Descendants("quote").First().Element("Open");
Console.WriteLine(open == null);
Console.WriteLine(open);

对。False后跟

您在查询中执行的那些空检查是毫无意义的,几乎所有这些元素都存在于XML中,但其中许多是空的。您正试图解析空字符串,但未能给出错误信息。您应该给我们一个示例XML,它代表您实际拥有的内容,即其中包含值。如果这是您所拥有的,那么您执行的检查类型是错误的

我像这样重新构造了查询,并标记了异常发生的位置:

var query =
    from quote in doc.Descendants("quote")
    let lastTradeDate = (DateTime)quote.Element("LastTradeDate")
    where lastTradeDate == targetDate
    let symbol = (string)quote.Attribute("symbol")
    let open = (double)quote.Element("Open") // EXCEPTION: empty string to a double?
    let daysHigh = (double)quote.Element("DaysHigh") // DITTO
    let daysLow = (double)quote.Element("DaysLow") // DITTO
    let lastTradePriceOnly = (double)quote.Element("LastTradePriceOnly")
    let volume = (long)quote.Element("Volume") // no Volume element exists, null check might be appropriate
    select new DailyPricingVolDP(symbol, lastTradeDate, open, daysHigh, daysLow, lastTradePriceOnly, volume);

您在查询中执行的那些空检查是毫无意义的,几乎所有这些元素都存在于XML中,但其中许多是空的。您正试图解析空字符串,但未能给出错误信息。您应该给我们一个示例XML,它代表您实际拥有的内容,即其中包含值。如果这是您所拥有的,那么您执行的检查类型是错误的

我像这样重新构造了查询,并标记了异常发生的位置:

var query =
    from quote in doc.Descendants("quote")
    let lastTradeDate = (DateTime)quote.Element("LastTradeDate")
    where lastTradeDate == targetDate
    let symbol = (string)quote.Attribute("symbol")
    let open = (double)quote.Element("Open") // EXCEPTION: empty string to a double?
    let daysHigh = (double)quote.Element("DaysHigh") // DITTO
    let daysLow = (double)quote.Element("DaysLow") // DITTO
    let lastTradePriceOnly = (double)quote.Element("LastTradePriceOnly")
    let volume = (long)quote.Element("Volume") // no Volume element exists, null check might be appropriate
    select new DailyPricingVolDP(symbol, lastTradeDate, open, daysHigh, daysLow, lastTradePriceOnly, volume);

您是否在DailyPricingVolDP的构造函数中进行任何解析?您肯定应该首先将LINQ查询拆分为更易于管理的部分。例如,您可以先执行查询,而不在查询中创建DailyPricingVolDP对象,然后可以循环处理结果,例如使用foreach在每次迭代中创建一个DailyPricingVolDP。这样,一步一步地调试就容易多了,并且可以准确地看到解析失败的地方。@w0lf None。。目前DailyPricingVolDP中没有解析。@Nailuj我现在正在做。我也这么想,它变得很笨重。这只是一个猜测,但是如果你为构造函数参数编写类似的解析函数,它会起作用吗?我不认为Linq to XML能够解析NULL或string.Empty的double,这将是空元素的值。您是否在DailyPricingVolDP的构造函数中进行任何解析?您肯定应该首先将Linq查询拆分为更易于管理的部分。例如,您可以先执行查询,而不在查询中创建DailyPricingVolDP对象,然后可以循环处理结果,例如使用foreach在每次迭代中创建一个DailyPricingVolDP。这样,一步一步地调试就容易多了,并且可以准确地看到解析失败的地方。@w0lf None。。目前DailyPricingVolDP中没有解析。@Nailuj我现在正在做。我也这么想,它变得很笨重。这只是一个猜测,但是如果你为构造函数参数编写类似的解析函数,它会起作用吗?我不知道
我不认为Linq to XML能够解析NULL或string.Empty中的double,这将是空元素的值。这主要是一条注释,旨在为您指明正确的方向。如果我们能得到代表实际XML的XML,那么我可以提供一个真正的解决方案。谢谢。我怀疑我可能需要检查null以及空字符串。这主要是一个注释,只是为了给您指出正确的方向。如果我们能得到代表实际XML的XML,那么我可以提供一个真正的解决方案。谢谢。我怀疑我可能需要检查null以及空字符串。谢谢。我会给你的,但我想这取决于时间安排。@StatsViaCsh:时间安排?我想我没听懂。我会给你答案的,先生。最后是最快的枪。下一个。@StatsViaCsh:噢,你说的时间安排是指杰夫的答案来得更快/第一个?你使用的奇怪的时钟:-哦,是时钟问题吗?我想我应该重置我的系统时钟谢谢我会给你的,但我想这取决于时间安排。@StatsViaCsh:时间安排?我想我没听懂。我会给你答案的,先生。最后是最快的枪。下一个。@StatsViaCsh:噢,你说的时间安排是指杰夫的答案来得更快/第一个?你使用的奇怪的时钟:-哦,是时钟问题吗?我想我应该重置我的系统时钟