2016-05-13 5 views
1

私は必要なすべてのデータを正常に抽出しましたが、すべてのプレーヤーが同じStatを持っているわけではないため、linqを使用して同じ要素と属性名でXMLをクエリする方法

XMLファイル:

<Team ID="3"> 
    <Player ID="p24"> 
     <Name>Kobe Bryant</Name> 
     <Position>Forward-Guard</Position> 
     <Stat Type="firstname">Kobe</Stat> 
     <Stat Type="lastname">Bryant</Stat> 
     <Stat Type="birthdate">1978-08-31</Stat> 
     <Stat Type="birthplace">USA</Stat> 
     <Stat Type="firstnationality">USA</Stat> 
     <Stat Type="weight">212</Stat> 
     <Stat Type="height">6'6</Stat> 
     <Stat Type="jerseynum">24</Stat> 
     <Stat Type="realposition">Forward-Gaurd</Stat> 
     <Stat Type="realpositionside">Unknown</Stat> 
     <Stat Type="joindate">1996-07-28</Stat> 
     <Stat Type="country">USA</Stat> 
    </Player> 
    <Player ID="p30"> 
     <Name>Nick Young</Name> 
     <Position>Forward-Guard</Position> 
     <Stat Type="firstname">Nick</Stat> 
     <Stat Type="lastname">Young</Stat> 
     <Stat Type="birthdate">1985-06-01</Stat> 
     <Stat Type="weight">210</Stat> 
     <Stat Type="height">6'7</Stat> 
     <Stat Type="jerseynum">30</Stat> 
     <Stat Type="realposition">Forward-Guard</Stat> 
     <Stat Type="realpositionside">Unknown</Stat> 
     <Stat Type="joindate">2015-07-02</Stat> 
     <Stat Type="country">USA</Stat> 
    </Player> 
    <TID>ARS</TID> 
    <Stadium ID="350"> 
     <Capacity>19000</Capacity> 
     <Name>Staples Center</Name> 
    </Stadium> 
    <TeamOfficial Type="Assistant Manager" ID="AM56" country="USA"> 
     <PersonName> 
      <BirthDate>1975-11-16</BirthDate> 
      <First>Mark</First> 
      <Last>Madsen</Last> 
      <join_date>2014-07-01</join_date> 
     </PersonName> 
    </TeamOfficial> 
    <TeamOfficial Type="Assistant Coach" ID="AC51" country="USA"> 
     <PersonName> 
      <BirthDate>1968-10-22</BirthDate> 
      <First>Jim</First> 
      <Last>Eyen</Last> 
      <join_date>1999-09-30</join_date> 
     </PersonName> 
    </TeamOfficial> 
</Team> 

C#コード:

XDocument xDoc = XDocument.Load("test.xml"); 

var TeamQ = from T in xDoc.Descendants("Team") 
      where (string)T.Attribute("ID") == "3" 
      from P in T.Elements("Player") 
      let fn = P.Elements("Stat") 
      select new 
      { 
       PlayerTeamID = (string)P.Attribute("ID"), 
       Position = (string)P.Element("Position"), 
       Stats = fn.Select(x => (string)x.Value) 
       .ToList() 

      }; 

      foreach (var tP in TeamQ) 
      { 
       listBox.Items.Add(tP.PlayerTeamID);    
      } 

私は、オブジェクトのリストで、これらのデータを保存したいと思います。しかし、クラスのプロパティに値を格納しようとすると、データが失われているという事実のためにデータが不一致になります。たとえば、クラスに第1の国籍を格納しようとすると、第2のプレーヤーに到達すると、第2のプレーヤーの高さが格納されます。

答えて

1

リストの代わりにstatsのための辞書を使用してみてください:

XDocument xDoc = XDocument.Load(@"c:\test.xml"); 
var TeamQ = from T in xDoc.Descendants("Team") 
      where (string)T.Attribute("ID") == "3" 
      from P in T.Elements("Player") 
      let fn = P.Elements("Stat") 
      select new 
      { 
       PlayerTeamID = (string)P.Attribute("ID"), 
       Position = (string)P.Element("Position"), 
       Stats = fn.Select(x => 
            new { key = x.Attribute("Type").Value 
                   .ToString(), 
             val = x.Value.ToString() }) 
          .ToDictionary(k => k.key, 
             var => var.val, 
             StringComparer.OrdinalIgnoreCase) 
      }; 

foreach (var tP in TeamQ) 
{ 
    Console.WriteLine(tP.PlayerTeamID); 
    //example how to get a value for a key 
    if (tP.Stats.ContainsKey("firstnationality")) 
    { 
     Console.WriteLine(tP.Stats["firstnationality"]); 
    } 
    else 
    { 
     Console.WriteLine("\"firstnationality\" not found"); 
    } 

    //example output all key->values pairs 
    foreach (var st in tP.Stats) 
    { 
     Console.WriteLine("{0}=>{1}",st.Key,st.Value); 

    } 
} 
関連する問題