2012-04-04 22 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 - Collecion of (Previous and Next Marks) 
1 - Collecion of (Previous and Next Marks) 
5 - Collecion of (Previous and Next Marks) 

其中0,1,5是學生的ID,並相應地是學生的標誌的集合。

對於這一點,我寫了這個查詢,這是不是很給我的輸出:
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來選擇使用字典的密鑰,但它提供了一些錯誤。

,我在這裏使用解析

類文件:

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

請顯示您到目前爲止的查詢。 – 2012-04-04 15:14:40

+0

@DanielHilgarth:哎呀!忘記了片段。添加 – user1240679 2012-04-04 15:17:03

回答

2

檢查:

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

請注意,您的XML可能有一個錯誤: 代替<Previous id="1">Marks 1</Previous>應該有可能<Previous mid="1">Marks 1</Previous>