0

私は次のxml構造を持っています

<quiz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="quiz.xsd">
    <mchoice>
        <question>What is the capital city of Australia?</question>
        <answer>Sydney</answer>
        <answer correct="yes">Canberra</answer>
        <answer>Melbourne</answer>
        <answer>Gold Coast</answer>
    </mchoice>
</quiz>

そして、次のコードを使用してCLR型に変換したい

public class Question
{
    public int ID { get; set; }
    public string QuestionText { get; set; }
    public List<Answer> Answers { get; set; }
}

public class Answer
{
    public string Answer1 { get; set; }
    public string Answer2 { get; set; }
    public string Answer3 { get; set; }
    public string Answer4 { get; set; }

}




public List<Question> GetAll()
        {
            var doc = XDocument.Load(Filepath);
            var results = (from x in doc.Descendants("mchoice")
                           select new Question()
                                      {
                                          ID = Convert.ToInt16(x.Element("ID")),
                                          QuestionText = x.Element("question").Value.ToString(),
                                          Answers = new List<Answer>()
                                          {
                                             //How I would fill Answer collection

                                          }


                                      }).ToList();
            return results;
        }

現在、現在の設計には2つの問題があります。

  1. Answer コレクションを埋める方法
  2. 現在の設計で正解属性をどのように処理するか。
4

2 に答える 2

1

モデルに不一致があるようです。クラスには 4 つの個別の "Answer" プロパティがありAnswerます。ただし、QuestionクラスにはAnswerオブジェクトのリストが含まれています。XML には、1 つの質問に対応する 4 つの回答が含まれています。質問のより正確なモデルは、次のいずれかのようになります。

public class Question
{
    public int ID { get; set; }
    public string QuestionText { get; set; }
    public List<string> Answers { get; set; }
    public int CorrectAnswerIndex { get; set; } 
}

その場合、Answerクラスは完全に無視できます。

または、クラスをそのままにして、クラスをより似たものにQuestion変更することもできますAnswer

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

これらのアプローチのいずれかを使用すると、XML マッピングを実行する方法を簡単に確認できます。ただ、ご指摘のとおり、設計が根本的に間違っているので正解はありません

最初の例では、@LB が示唆するように XML-Object マッピングを行うことができます。CorrectAnswerIndexただし、リスト内の正解文字列のインデックスと同じプロパティを設定する必要があります。

于 2012-09-20T15:13:43.393 に答える
1

最初のアイデアで

    public class Question
    {
        public int ID { get; set; }
        public string QuestionText { get; set; }
        public Answer Answer { get; set; }
    }

    public class Answer
    {
        public string Answer1 { get; set; }
        public string Answer2 { get; set; }
        public string Answer3 { get; set; }
        public string Answer4 { get; set; }

    }
var results = (from x in doc.Descendants("mchoice")
               let answers = x.Elements("answer")
               select new Question()
                 {
                      ID = Convert.ToInt16(x.Element("ID")),
                      QuestionText = x.Element("question").Value,
                      Answer = new Answer
                        {
                            Answer1 = answers.First().Value,
                            Answer2 = answers.Skip(1).First().Value,
                            Answer3 = answers.Skip(2).First().Value,
                            Answer4 = answers.Last().Value
                         }


                  }).ToList();

より簡単なモデルで

public class Question
    {
        public int ID { get; set; }
        public string QuestionText { get; set; }
        public List<string> AnswerTextList { get; set; }
    }

var results = (from x in doc.Descendants("mchoice")

                           select new Question()
                           {
                               ID = Convert.ToInt16(x.Element("ID")),
                               QuestionText = x.Element("question").Value,
                               AnswerTextList = (x.Elements("answer").Select(m => m.Value.ToString()).ToList())
                           }).ToList();

良いモデルで

public class Question
    {
        public int ID { get; set; }
        public string QuestionText { get; set; }
        public List<Answer> AnswerList { get; set; }
    }

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

var results = (from x in doc.Descendants("mchoice")
        select new Question()
        {
            ID = Convert.ToInt16(x.Element("ID")),
            QuestionText = x.Element("question").Value,
            AnswerList = (x.Elements("answer").Select(m => new Answer
            {
                Text = m.Value,
                IsCorrect = m.Attribute("correct") != null && m.Attribute("correct").Value == "yes"
            }).ToList())
        }).ToList();
于 2012-09-20T15:18:48.583 に答える