Может ли кто-нибудь помочь мне создать запрос LINQ to XML? - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть три класса

ExamProduced:
+ ExamID
+ Date
+ Seed
+ Exercises

Exercise
+ Quantity
+ IsMakeUp
+ Score
+ Answers

Answer
+ IsCorrect

И у меня есть этот XML-файл

    <Answers ExamID="1" StudentID="abcd" Date="10/26/2011 11:50:34 AM" 
             Seed="495" IsSED="False">
      <Summary>
        <Objective ID="1" MakeUp="False" Quantify="5" 
                   Difficulty="Easy" Accredited="True" Produced="True">
          <Details Result="0" Date="10/26/2011 11:35:18 AM" />
          <Details Result="1" Date="10/26/2011 11:50:34 AM" />
        </Objective>
        <Objective ID="2" MakeUp="True" Quantify="5" 
                   Difficulty="Easy" Accredited="False" Produced="True">
          <Details Result="0" Date="10/26/2011 11:35:18 AM" />
          <Details Result="0" Date="10/26/2011 11:50:34 AM" />
        </Objective>
        <Objective ID="3" MakeUp="True" Quantify="2" 
                   Difficulty="Easy" Accredited="False" Produced="False">
          <Details Result="0" Date="10/26/2011 11:35:18 AM" />
          <Details Result="0" Date="10/26/2011 11:50:34 AM" />
        </Objective>
      </Summary>
      <Answer ProblemID="0" ObjectiveID="1" IsCorrect="True" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="9" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="1" IsCorrect="True" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="20" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="1" IsCorrect="True" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="16" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="1" IsCorrect="True" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="36" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="1" IsCorrect="True" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="18" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="2" IsCorrect="False" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="Null" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="2" IsCorrect="False" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="Null" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="2" IsCorrect="False" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="Null" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="2" IsCorrect="False" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="Null" />
      </Answer>
      <Answer ProblemID="0" ObjectiveID="2" IsCorrect="False" Difficulty="Easy">
        <Result DataType="System.Decimal" Value="Null" />
      </Answer>
    </Answers>

Ну, мне нужна помощь для создания этого запроса. Свойства ExamProduced можно получить через корень. Затем в упражнении взгляните на тег Сводка, в этом месте есть история ... поэтому мне нужно получить те значения, где атрибут «Произведенный» имеет значение «истина».

Например, две цели, если они выполнены, - это 1 и 2 задачи. Затем мне нужно получить количество значений и составить (для класса упражнений). Затем, как 1 и 2 цель была произведена, у каждого есть ответы, которые мне нужно получить, если значение было правильным или неправильным.

Заранее спасибо.

EDIT: Например, в этом случае классы должны иметь:

ExamProduced
+ ExamID: 1
+ Date: 10/26/2011 11:50:34 AM
+ Seed: 495
+ Exercises: { 2 items }
  {
      Exercise
      {
          + Quantity = 5
          + IsMakeUp = False;
          + Score = 1 (it means one hundred for Answers/Summary/Objective/LastDetail => Result)
          + Answers (5 items)
            {
               Answer
               {
                   + IsCorrect = true
               }
               Answer
               {
                   + Is...
               }
               Ans {..}
               Ans {..}
               Ans {..}
            }
      }
      Exercise
      {
          ...
      }
  }

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Вот мое слегка переработанное решение для данных, которые вы пытаетесь создать. Чтобы использовать это:

XElement xml = XElement.Load(...);
var exam = ExamProduced.ParseElement(xml);

И фактическая реализация:

public class ExamProduced
{
    public int ExamID { get; set; }
    public DateTime Date { get; set; }
    public int Seed { get; set; }
    public ExerciseCollection Exercises { get; private set; }

    public static ExamProduced ParseElement(XElement answersElement)
    {
        if (answersElement == null) throw new ArgumentNullException("answersElement");
        if (answersElement.Name != "Answers") throw new ArgumentException("element must be an <Answers> element");

        return new ExamProduced
        {
            ExamID = (int)answersElement.Attribute("ExamID"),
            Date = (DateTime)answersElement.Attribute("Date"),
            Seed = (int)answersElement.Attribute("Seed"),
            Exercises = ExerciseCollection.ParseElement(answersElement),
        };
    }
}

public class ExerciseCollection : ReadOnlyCollection<Exercise>
{
    private ExerciseCollection(IEnumerable<Exercise> exercises) : base(exercises.ToList()) { }

    internal static ExerciseCollection ParseElement(XElement answersElement)
    {
        var exercises =
            from objective in answersElement.XPathSelectElements("Summary/Objective")
            join answer in answersElement.Elements("Answer")
                on (int)objective.Attribute("ID") equals (int)answer.Attribute("ObjectiveID")
                into answers
            where answers.Any()
            select Exercise.ParseElements(objective, answers);

        return new ExerciseCollection(exercises);
    }
}

public class Exercise
{
    public int Quantity
    {
        get { return Answers != null ? Answers.Count : 0; }
    }
    public Decimal Score { get; set; }
    public bool IsMakeUp { get; set; }
    public AnswerCollection Answers { get; private set; }

    internal static Exercise ParseElements(XElement objective, IEnumerable<XElement> answerElements)
    {
        return new Exercise
        {
            IsMakeUp = (bool)objective.Attribute("MakeUp"),
            Score = objective.Elements("Details").Select(e => (decimal)e.Attribute("Result")).Last(),
            Answers = AnswerCollection.ParseElements(answerElements),
        };
    }
}

public class AnswerCollection : ReadOnlyCollection<Answer>
{
    private AnswerCollection(IEnumerable<Answer> answers) : base(answers.ToList()) { }

    internal static AnswerCollection ParseElements(IEnumerable<XElement> answerElements)
    {
        var answers =
            from answerElement in answerElements
            select Answer.ParseElement(answerElement);

        return new AnswerCollection(answers);
    }
}

public class Answer
{
    public bool IsCorrect { get; set; }

    internal static Answer ParseElement(XElement answerElement)
    {
        return new Answer
        {
            IsCorrect = (bool)answerElement.Attribute("IsCorrect"),
        };
    }
}
0 голосов
/ 15 декабря 2011

Если я правильно понял ваши требования, что-то вроде этого должно сработать:

public static ExamProduced GetExamProduced(XElement xml) {
    var examProduced = new ExamProduced
    {
        ExamID = (int)xml.Attribute("ExamID"),
        Date = (DateTime)xml.Attribute("Date"),
        Seed = (int)xml.Attribute("Seed"),
        Exercises = GetExercises(xml)
    };

    return examProduced;
}

public static List<Exercise> GetExercises(XElement xml) {
    var objs = 
        from objective in xml.Descendants("Objective")
        where (bool)objective.Attribute("Produced")
        let id = (int)objective.Attribute("ID")
        select new Exercise
            {
                ExerciseID = id,
                IsMakeUp = (bool)objective.Attribute("MakeUp"),
                Quantity = (int)objective.Attribute("Quantify"),
                Score = (int)objective.Elements().Last().Attribute("Result"),
                Answers = GetAnswers(xml, id)
            };

        return objs.ToList();
}

public static List<Answer> GetAnswers(XElement xml, int objectiveId) {
    var answers = 
            from answer in xml.Descendants("Answer")
            where (int)answer.Attribute("ObjectiveID") == objectiveId
            select new Answer
              {
                IsCorrect = (bool)answer.Attribute("IsCorrect")
              };
    return answers.ToList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...