У меня есть два класса - Cd
и Track
, которые я пытаюсь прочитать из файла XML с помощью Linq.
public Cd(string t, string a, string cat, DateTime rls, Track[] tr)
public Track(string t, int l)
XML выглядит следующим образом.
<media>
<cd>
<artist>Ozzy Osbourne</artist>
<album Name="Bark at the moon" Type="Metal" Tracks="5" ReleaseDate="1983-12-10">
<track Length="300">Bark at the moon</track>
<track Length="235">You're No Different</track>
<track Length="567">Now You See It (Now You Don't)</track>
<track Length="356">Rock 'N' Roll Rebel</track>
<track Length="120">Centre of Eternity</track>
</album>
</cd>
<cd>
<artist>Journey</artist>
<album Name="Escape" Type="Rock" Tracks="4" ReleaseDate="1981-07-31">
<track Length="300">Don't Stop Believin'</track>
<track Length="235">Stone in Love</track>
<track Length="567">Who's Crying Now</track>
<track Length="356">Keep on Runnin'</track>
</album>
</cd>
</media>
Код, который я пытаюсь использовать, выглядит следующим образом
XElement xdoc = XElement.Load("dbxml.xml");
var temp = from cds in xdoc.Descendants("cd")
select new Cd(
cds.Element("artist").Value,
cds.Element("album").Attribute("Name").Value,
cds.Element("album").Attribute("Type").Value,
DateTime.Parse(cds.Element("album").Attribute("ReleaseDate").Value),
new Track[] { // One Track reads fine..
new Track(cds.Element("album").Element("track").Value,
int.Parse(cds.Element("album").Element("track").Attribute("Length").Value))
}
);
Проблема в том, что я не знаю, как инициализировать массив со всеми дорожками, считанными из файла XML. Я мог бы обернуть весь запрос в .ToList()
, использовать анонимный тип и foreach
-it, но я хотел бы знать, есть ли способ сделать это всего за один запуск с linq.
cds.Elements("album").Elements("song")
возвращает коллекцию IEnumerable<XElement>
, которая должна быть добавлена в массив в виде диапазона и превращена в строку и целое число или что-то подобное. Любая помощь там?
Спасибо!