2012-04-04 15 views
1

私はXMLファイルを解析し、必要な形式でいくつかの出力を取得しようとしています。LINQを通じてXMLの要素から辞書を生成

私のXMLファイル形式です。

<?xml version="1.0" encoding="utf-8" ?> 
<Sample> 
    <Student name="Tom" id="0" batch="1"> 
    <Performance> 
     <Previous id="1">Marks 1</Previous> 
     <Next mid="2">Marks 2</Next> 
     <Next mid="3">Marks 3</Next> 
    </Performance> 
    </Student> 
    <Student name="Jerry" id="1" batch="1"> 
    <Previous mid="1">Marks 4</Previous> 
    <Next mid="2">Marks 5</Next> 
    <Next mid="3">Marks 6</Next> 
    <Next mid="4">Marks 12</Next> 
    </Student> 
    <Student name="Kate" id="5" batch="2"> 
    <Previous mid="2">Marks 7</Previous> 
    <Previous mid="3">Marks 8</Previous> 
    <Next mid="4">Marks 6</Next> 
    </Student> 
</Sample> 

私が取得しようとしています出力は、このXMLファイルから辞書です:

0、1、5、学生のIDがあり、それに対応している学生のマークの集合です
0 - Collecion of (Previous and Next Marks) 
1 - Collecion of (Previous and Next Marks) 
5 - Collecion of (Previous and Next Marks) 

。このため

、私はかなり私に出力を与えていないこのクエリを、書かれている:
UPDATE(クエリを追加)

XDocument xdoc = XDocument.Load("XMLfile1.xml"); 
      var content = xdoc.Descendants("Student") 
         .Select(st => st.Descendants("Previous") 
         .Union(st.Descendants("Next")) 
         .Select(terms => new Marks { MarksId = terms.Attribute("mid").Value, MarksName = terms.Value })).ToDictionary<Marks, int>(key => key.StudentId) ; 

問題:私は選択することはできませんよ
1学生用ノードのAttributeID
2. key => key.StudentIDを使用して辞書に使用するキーを選択できず、エラーが表示されます。あなたのXMLは、おそらくエラーがあること

var dictionary = (from student in xElement.Descendants("Student") 
        let marks = student.Descendants() 
         .Where(e => new []{"Previous" ,"Next"} 
           .Contains(e.Name.ToString())) 
        select new {student, marks}) 
        .ToDictionary(t => t.student.Attribute("id").Value, 
            t => t.marks.Select(mark => new Data { 
                     MarkId = mark.Attribute("mid").Value, 
                     MarkName = mark.Value 
                     }).ToList()); 

注:

私が解析し、ここで使用していますクラスファイル:この

class Marks 
    { 
     public int StudentID 
     { 
      get; 
      set; 
     } 
     public string MarksId 
     { 
      get; 
      set; 
     } 
     public string MarksName 
     { 
      get; 
      set; 
     } 
+2

これまでのクエリを表示してください。 –

+0

@DanielHilgarth:おっと!スニペットを挿入するのを忘れてしまった。追加された – user1240679

答えて

2

チェック の代わり<Previous id="1">Marks 1</Previous>は、おそらくそこにあるべき<Previous mid="1">Marks 1</Previous>

関連する問題