Как написать этот запрос для этих данных XML в LINQ для XML? - PullRequest
1 голос
/ 29 апреля 2009

Я читал документацию по linq to xml в msdn и некоторые другие учебные пособия, но пока не смог найти правильный способ выполнить этот запрос: (

По сути, я хочу просмотреть каждого ученика в классе, для каждого вопроса вести счетчик индивидуальных навыков, т. Е. Для ученика 123 счет должен быть 001.101.033.002.001 - 1, 001.101.035.002.001 1, 001.101.033.002.002 - 0. поскольку счетчик навыков основан на том, является ли вопрос правильным (1) или неправильным (0).

<assessment name="english101" level="primary 6">
   <class id="23" name="1A">
      <student id="123" name="Jack Black">
         <question id="101" correct="1">
            <skill id="001.101.033.002.001" topicId="033" subtopicId="002" subtopicdesc="Launching a browser" topicdesc="Point and Click">Able to recognize and use desktop icon</skill>

            <skill id="001.101.035.002.001" topicId="035" topicDesc="Typing" subtopicId="002" subtopicDesc="Using Words">Able to write on screen</skill>
         </question>

         <question id="102" correct="0">
            <skill id="001.101.033.002.002" topicId="033" subtopicId="002" subtopicdesc="Launching a browser" topicdesc="Point and Click">Able to recognize and use the mouse</skill>

            <skill id="001.101.035.002.001" topicId="035" topicDesc="Typing" subtopicId="002" subtopicDesc="Using Words">Able to write on screen</skill>
         </question>
      </student>

      <student id="124" name="Tim Robbins">
         <question id="103" correct="1">
            <skill id="001.101.033.002.002" topicId="033" subtopicId="002" subtopicdesc="Launching a browser" topicdesc="Point and Click">Able to recognize and use the mouse</skill>

            <skill id="001.101.035.002.001" topicId="035" topicDesc="Typing" subtopicId="002" subtopicDesc="Using Words">Able to write on screen</skill>
         </question>

         <dtasResult>
            <skill id="001.101.033.002.002" result="weak" />

            <skill id="001.101.033.002.002" result="strong" />
         </dtasResult>
      </student>
   </class>
</assessment>

пока код у меня здесь:

    //Open up the xml and traverse to the student nodes.
                    XElement root = XElement.Load(fileLocation);
                    IEnumerable<XElement> students = root.Elements("class").Elements("student");

                    string currentStudentId = "";
                    foreach (XElement student in students)
                    {
                        currentStudentId = student.Attribute("id").ToString();
                        //this code chunk below doesn't work!
XElement questions = root.Descendants("question")
                                                .Where(question =>
                                                question.Attribute(""));

                        Console.WriteLine(student.DescendantsAndSelf("question"));
                        Console.WriteLine();
                        Console.WriteLine();
                    }

Мне еще предстоит выяснить, как выполнить цикл для каждого вопроса на каждого учащегося ... и код в середине выгула не работает !!

Обновление:

если бы я хотел вычислить общий вопрос на одного учащегося, как бы я мог изменить ваш запрос выше для этого? я пытаюсь grp.Count (z => z.Correct) и другой метод, но я не могу сделать это правильно, спасибо:)

Ответы [ 2 ]

4 голосов
/ 29 апреля 2009

Второе редактирование комментариев; Я думаю, что это делает то, что вы хотите ...

var qry = from cls in doc.Root.Elements("class")
          from student in cls.Elements("student")
          from question in student.Elements("question")
          from skill in question.Elements("skill")
          select new {
            Student = (int)student.Attribute("id"),
            Skill = (string)skill.Attribute("id"),
            Correct = (int)question.Attribute("correct")
          } into denorm
          group denorm by new {
            denorm.Student,
            denorm.Skill
          } into grp
          orderby grp.Key.Student, grp.Key.Skill
          select new {
            grp.Key.Student,
            grp.Key.Skill,
            Tally = grp.Sum(x => x.Correct)
          };

foreach (var row in qry)
{
  Console.WriteLine("{0}\t{1}\t{2}",
    row.Student, row.Skill, row.Tally);
}
0 голосов
/ 29 апреля 2009

Не совсем уверен, если это то, что вы хотите, но я попробую:

foreach (XElement student in students)
        {
            currentStudentId = student.Attribute("id").ToString();
            Console.WriteLine(currentStudentId);
            //this code chunk below doesn't work!
            IEnumerable<XElement> correctQuestions = student.Descendants("question").
                                  Where(q => q.Attribute("correct").Value == "1");                
            //Here you would do same for false answers

            //loop through correct answers
            foreach (XElement q in correctQuestions)
            {
                IEnumerable<XElement> skills = q.Descendants("skill");
                foreach (XElement s in skills)
                {
                    //this prints "001.101.035.002.001" etc  
                    Console.WriteLine(s.Attribute("id").Value);
                }
            }
            Console.WriteLine();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...