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

时间:2012-01-22 21:31:52

标签: linq c#-4.0 linq-to-xml

我正在使用C#中的xml文档,该文档具有多个(100+)点的股票市场数据。我想创建对象并将它们添加到List<>通过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;

2 个答案:

答案 0 :(得分:1)

您需要创建一个类:

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

答案 1 :(得分:1)

这取决于您的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 ...

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