2012-01-22 2 views
1

Я работаю с XML-документом на C#, который имеет несколько (100+) точек данных фондового рынка. Я хотел бы создать объекты и добавить их в список <>, передав значения инициализации, полученные из XML-документа через linq. На данный момент я просто могу запустить запрос linq и вернуть одно из полей xml, в приведенном ниже коде, атрибут «symbol». Я также хотел бы вернуть документ «LastTradeDate, DaysLow, DaysHigh, LastTradePriceOnly, Open и Volume». Оттуда мой пользовательский конструктор: StockDataPoint (Symbol, TradeDate, Open, High, Low, Close, Volume). Толчок в правильном направлении был бы велик. Вот текущий LINQ:Как вернуть несколько элементов/атрибутов xml с помощью 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; 

ответ

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 ... 

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

+0

Джон, спасибо. Я знаю, чтобы держать болтовню до минимума, но я только что получил вашу книгу на прошлой неделе. :) – StatsViaCsh

+0

@StatsViaCsh: Goodo - надеюсь, вам понравится :) –

1

Вам нужно создать класс:

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

Благодаря слайкам, я видел это концептуально, очевидно, в ретроспективе. – StatsViaCsh

Смежные вопросы