2011-02-09 3 views
0

Linq를 사용하여 XML 파일에서 읽으려고 시도하는 두 클래스 - CdTrack이 있습니다. linq to xml 초기화 배열

public Cd(string t, string a, string cat, DateTime rls, Track[] tr)

public Track(string t, int l)

XML은 다음과 같습니다. 문제는 내가 XML 파일에서 읽은 모든 트랙 배열을 초기화하는 방법을 모르는 것입니다

 
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)) 
       } 
     ); 

을 다음과 같이

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

내가 사용하기 위해 노력하고있어 코드입니다. .ToList()에 전체 쿼리를 래핑 할 수 있고 anonomyous 타입을 사용하고 foreach -it하지만 linq을 사용하여 실행하는 방법이 있는지 알고 싶습니다.

cds.Elements("album").Elements("song")IEnumerable<XElement> 컬렉션을 반환하며 배열에 범위로 추가되고 문자열과 int 또는 그로 인해 영향을받는 대상으로 바뀌어야합니다. 밖에 도움이 필요 하신가요?

감사합니다.

(from t in cds.Element("album").Elements("track") 
    select new Track(..., ...) 
).ToArray() 

답변

1

이 작동 것이다 : 당신의 LINQ에서

+0

이것은 밖으로 일했다 - 고마워! 실제로 모든 필드에 대해 기본 생성자 및 속성이 있습니다. 속성을 사용하여이 쿼리를보다 쉽게 ​​읽을 수있는 방법에 대해 자세히 설명 하시겠습니까? – citizencane

+0

독자가 더 쉽게 파싱 할 수있는 속성 할당을 찾습니다. 즉, '새 Cd() {Artist = ..., Album = ...,}'트랙과 동일합니다. – BrokenGlass

+0

네, 읽기 쉬운 검색어 고맙습니다! 간단히 말해 C#을 더 공부해야합니다. :-) – citizencane

0

,이 같은 뭔가

new Track[] { // One Track reads fine.. 
    new Track(cds.Element("album").Element("track").Value, 
     int.Parse(cds.Element("album").Element("track").Attribute("Length").Value)) 
     } 

교체 쉽게

XElement xdoc = XElement.Load("test.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), 
       cds.Element("album").Descendants("track").Select(t => new Track(t.Value, int.Parse(t.Attribute("Length").Value))).ToArray() 
       ); 

은 (IMO) 읽기 속성을 사용 :

select new Cd() 
    { 
     Artist = cds.Element("artist").Value, 
     Album = cds.Element("album").Attribute("Name").Value, 
     Type = cds.Element("album").Attribute("Type").Value, 
     ReleaseDate = DateTime.Parse(cds.Element("album").Attribute("ReleaseDate").Value), 
     Tracks = cds.Element("album") 
        .Descendants("track") 
        .Select(t => new Track() 
        { 
         Name = t.Value, 
         Length = int.Parse(t.Attribute("Length").Value) 
        }).ToArray() 
    }; 

CdTrack에 기본 생성자를 추가하고 공용 속성을 표시하거나 명명 된 매개 변수를 사용하는 것이 좋습니다. 이렇게하면 LINQ 문을 훨씬 쉽게 읽을 수 있습니다.

+0

고마워요! 나는 모든 앨범의 첫 번째 트랙을 나머지 트랙 모두에 대해 반복했지만. 달에서 다섯 나무 껍질과 네 믿음을 멈추지 마라. 어쩌면 나는 뭔가를 엉망으로 만들었 을까? – citizencane

+0

저는 Element와 IIRC를 typo'ed했습니다. 당신이 원하는 요소입니다. BrokenGlass의 대답은 .Descendants를 사용하는 것이 더 나은 방법 일 수 있습니다. – ongle