2011-12-14 142 views
0

我有三類有人可以幫我創建一個LINQ to XML查詢嗎?

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的目標產生,每個人都有我需要得到的答案,如果價值是正確的錯誤。

在此先感謝。

編輯: 例如,在這種情況下,類應具備:

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 
     { 
      ... 
     } 
    } 

回答

1

這是我爲你想建立數據略高於設計的解決方案。要使用它:

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

請傑夫,檢查編輯.. – Darf 2011-12-15 00:12:38

0

如果我理解正確的話你的要求,這樣的事情應該做的伎倆:

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