如何使用linq返回多个xml元素/属性,并使用它们创建对象?

如何使用linq返回多个xml元素/属性,并使用它们创建对象?,linq,c#-4.0,linq-to-xml,Linq,C# 4.0,Linq To Xml,我正在使用C#中的一个xml文档,该文档包含多个(100多个)股票市场数据点。我希望通过linq传递从xml文档检索到的初始化值来创建对象并将它们添加到列表中。目前,我只能够运行linq查询并在下面的代码中返回一个xml字段,即属性“symbol”。我还想返回文档的“LastTradeDate、DaysLow、DaysHigh、LastTradePriceOnly、Open和Volume”。从这里开始,我的自定义构造函数是:StockDataPoint(symbol、TradeDate、Open

我正在使用C#中的一个xml文档,该文档包含多个(100多个)股票市场数据点。我希望通过linq传递从xml文档检索到的初始化值来创建对象并将它们添加到列表中。目前,我只能够运行linq查询并在下面的代码中返回一个xml字段,即属性“symbol”。我还想返回文档的“LastTradeDate、DaysLow、DaysHigh、LastTradePriceOnly、Open和Volume”。从这里开始,我的自定义构造函数是:StockDataPoint(symbol、TradeDate、Open、High、Low、Close、Volume)。朝着正确的方向轻推会很好。以下是当前的linq:

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;

您需要创建一个类:

select new YourClass {
    Symbol = s.Attribute("symbol").Value,
    ...
}

这取决于您的XML格式,但您可能只需要以下内容:

...
select new StockDataPoint((string) s.Attribute("symbol"),
                          (DateTime) s.Attribute("TradeDate"),
                          (decimal) s.Attribute("Open"),
                          (decimal) s.Attribute("High"),
                          (decimal) s.Attribute("Low"),
                          (decimal) s.Attribute("Close"),
                          (long) s.Attribute("Volume"));
请注意,通过使用
XAttribute
上的显式运算符,您可以避免自己执行解析。实际上,您也可以在前面的查询中使用此选项:

var makeInfo = from s in doc.Descendants("quote")
               where s.Attribute("symbol") &&
                     (DateTime?) s.Attribute("LastTradeDate") == targetDate
               select ...

如果强制转换的目标是可空类型(可空值类型或引用类型),那么如果缺少该属性,则结果将是该类型的空值,这非常方便。

Jon,谢谢。我知道尽量减少闲聊,但我上周刚收到你的书@StatsViaCsh:Goodo-希望你喜欢:)谢谢slaks,我从概念上看到了它,事后看很明显。