Как мне вернуть несколько элементов / атрибутов xml с помощью linq и создать объекты с ними? - PullRequest
1 голос
/ 23 января 2012

Я работаю с XML-документом на C #, который имеет несколько (более 100) точек данных фондового рынка.Я хотел бы создать объекты и добавить их в список <>, передав значения инициализации, извлеченные из XML-документа через linq.На данный момент я просто могу выполнить запрос linq и вернуть одно из полей xml, в приведенном ниже коде, атрибут «символ».Я также хотел бы вернуть документы «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 ]

1 голос
/ 23 января 2012

Ну, это зависит от вашего формата 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 ...

Если целью приведения является тип NULL (тип значения NULL или ссылочный тип), то если атрибут отсутствует, результатом будет нулевое значение для этого типа, что очень удобно.

1 голос
/ 23 января 2012

Вам необходимо создать класс:

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