可以将这个xml读入我的类结构中

时间:2012-08-20 15:46:03

标签: c# xml linq-to-xml

我需要将这个xml读入一个类。我是LINQ to XML的新手。

<quiz>
  <step id="1">
    <question id="1">
      <text>What is the world’s tallest tower?</text>
      <answers>
        <answer id="1" value="0">Eiffel Tower</answer>
        <answer id="2" value="0">Petronas Tower</answer>
        <answer id="3" value="0">Canton Tower</answer>
        <answer id="4" value="1">Tokyo Skytree </answer>
      </answers>
    </question>
  </step>
</quiz>

我已经创建了这两个类,但我不确定如何轻松阅读这些信息。我的头被撞坏了。

public class QuizQuestion
{
    public int StepId { get; set; }
    public int QuestionId { get; set; }
    public string QuestionText { get; set; }
    public List<QuizAnswer> Answers { get; set; }
}

public class QuizAnswer
{
    public int AnswerId { get; set; }
    public int CorrectAnswer { get; set; }
    public String AnswerText { get; set; }
}

我试过这个,不确定它是否正确

var quizQuestions = new List<QuizQuestion>();

_cacheLock.EnterWriteLock();
try
{
    XDocument xmlDoc = XDocument.Load(_questionsFilePath);

    XDocument data = XDocument.Load(_questionsFilePath);

    quizQuestions = (from c in data.Descendants("quiz")
    orderby c.Attribute("question")
    select new QuizQuestion()
    {
        StepId = Convert.ToInt32(c.Attribute("Id").Value),
        QuestionId = Convert.ToInt32(c.Attribute("Id").Value),
        QuestionText = c.Value
    }).ToList();

    foreach (QuizQuestion quiz in quizQuestions)
    {
        quiz.Answers = 
            (from c in data.Descendants("quiz")
                orderby c.Attribute("question")
                where Convert.ToInt32(c.Attribute("Id").Value) == 1
                select new QuizAnswer()
                {
                    AnswerId = Convert.ToInt32(
                                 c.Attribute("id").Value),
                    AnswerText = c.Value,
                    CorrectAnswer = Convert.ToInt32(
                                      c.Attribute("value").Value)
                }).ToList();
    }

}
catch (NullReferenceException e)
{

}

5 个答案:

答案 0 :(得分:0)

这应该有效

var quizQuestions = (from question in data.Descendants("question")
                  select new QuizQuestion
                  {

                    //...                    

                    Answers = (from answer in question.Descendants("answer")
                              select new QuizAnswer
                              {

                                 //...

                              }).ToList(),

                  }).ToList();

答案 1 :(得分:0)

只需在有效的xml上添加一些检查(某些元素可以为null或其他内容)

quizQuestions = (from s in data.Root.Elements("step")
                     from q in s.Elements("question") 
                     where q != null
    orderby s.Attribute("question")
    select new QuizQuestion()
    {
        StepId = Convert.ToInt32(s.Attribute("id").Value),
        QuestionId = Convert.ToInt32(q.Attribute("id").Value),
        QuestionText = q.Value,
        Answers = (from a in q.Element("answers").Elements("answer")
                   select new QuizAnswer()
                       {
                           AnswerId = Convert.ToInt32(a.Attribute("id").Value),
                           CorrectAnswer = Convert.ToInt32(a.Attribute("value").Value),
                           AnswerText = a.Value
                       }).ToList()
    }).ToList();

答案 2 :(得分:0)

如果您的XML不会改变结构,您可以从Schema生成一个类。 在Visual Studio工具中使用xsd.exe,然后使用XmlSerializer类将XML反序列化到类中。

MSDN Artical on how to use the XSD tool

MSDN Artical on the XMLSerializer

答案 3 :(得分:0)

这样的事情:

IEnumerable<QuizQuestion> questions =
    from step in doc.Descendants("step")
    from question in step.Descendants("question")
    select new QuizQuestion
    {
        StepId = int.Parse(step.Attribute("id").Value),
        QuestionId =  int.Parse(question.Attribute("id").Value),
        QuestionText = question.Element("text").Value,
        Answers = (from answer in question.Descendants("answer")
                    select new QuizAnswer
                    {
                        AnswerId = int.Parse(answer.Attribute("id").Value),
                        CorrectAnswer = int.Parse(answer.Attribute("value").Value),
                        AnswerText = answer.Value
                    }).ToList()
    };

答案 4 :(得分:0)

我测试了我的并且它有效,包括根据他们的ID订购问题。

quizQuestions = (from step in data.Element("quiz").Elements("step")
                 from question in step.Elements("question")
                 orderby question.Attribute("id").Value
                 select new QuizQuestion()
                 {
                     StepId = Convert.ToInt32(step.Attribute("id").Value),
                     QuestionId = Convert.ToInt32(question.Attribute("id").Value),
                     QuestionText = question.Element("text").Value,
                     Answers = (from answer in question.Element("answers").Elements("answer")
                         select new QuizAnswer
                         {
                             AnswerId = Convert.ToInt32(answer.Attribute("id").Value),
                             AnswerText = answer.Value,
                             CorrectAnswer = Convert.ToInt32(answer.Attribute("value").Value)
                         }).ToList()
                  }).ToList();
相关问题