2012-04-04 2 views
1

Я экспериментирую с синтаксическим анализом XML-файла и получаю некоторый вывод в требуемом формате.Создание словаря из элементов XML через LINQ

Вот мой формат 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 являются идентификаторы студентов, и, соответственно, являются коллекции марок этого студента ,

Для этого я написал этот запрос, который не совсем дает мне выход:
UPDATE (добавлен Query)

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

Пожалуйста, покажите запрос, который у вас есть. –

+0

@ DanielHilgarth: Ой! забыл нарисовать фрагмент. добавленной – user1240679

ответ

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>