Попытка разобрать дерево XML с Linq в XML (C #) - PullRequest
6 голосов
/ 27 апреля 2009

Я хотел бы отразить дерево XML в своей структуре объектов, но я довольно новичок в LINQ to XML

У меня есть XML со следующей структурой:

<questions>
<question id="q1">
  <number>1</number>
  <text>some text11</text>
  <answers>
     <answer>
      <v>some text11</v>
    </answer>
    <answer>
      <v>some text11</v>
    </answer>
  </answers>
</question>
<question id="q2">
  <number>2</number>
  <text>some text2</text>

<answers>
    <answer>
      <v>some text22</v>
    </answer>
    <answer>
      <v>some text22</v>
    </answer>
  </answers>
</question>
<question id="q3">
  <number>3</number>
  <text>some text3</text>
  <answers>
    <answer>
      <v>some text33</v>
    </answer>
    <answer>
      <v>some text33</v>
    </answer>
    <answer>
      <v>some text33</v>
      <addDescription>some text333</addDescription>
      <textBox/>
    </answer>
  </answers>
</question>
</questions>

... и у меня есть следующие классы:

public class Question
{
    public string text { get; set; }
    public IList<Anwser> anwsers = new List<Anwser>();
}

public class Anwser
{
    public string content { get; set; }
}

... и я создал следующий (неправильный) запрос Linq:

        List<Question> questions = (from xml in xdoc.Element("survey").Elements("questions").Elements("question")
                                    select new Question()
                                               {
                                                   text = xml.Element("text").Value,
                                                   anwsers =
                                                       (from anwsers in
                                                            xdoc.Element("survey").Elements("questions").Elements("question").Elements(
                                                            "answers").Elements(
                                                            "answer")
                                                        select new Anwser()
                                                                   {
                                                                       content = anwsers.Element("v").Value
                                                                   }

                                                       ).ToList()
                                            }).ToList();

Конечно, таким образом я получаю каждый раз, когда все ответы на все вопросы добавляются в каждый список. Как это решить? Я могу себе представить, что это просто, но я понятия не имею:)

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

Ответы [ 3 ]

7 голосов
/ 27 апреля 2009

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

List<Question> questions = (from question in xdoc.Element("survey").Element("questions").Elements("question")
         select new Question
         {
           text = question.Element("text").Value,
           anwsers = (from answer in question.Element("answers").Elements("answer")
                select new Anwser
                {
                  content = answer.Element("v").Value
                }).ToList()
         }).ToList();
4 голосов
/ 27 апреля 2009

Вы были очень близки. В выборе новых частей вам не нужно () после имен классов. Также вы хотите использовать .Descendents () вместо .Elements (). Единственная другая часть заключалась в том, что ответы должны использовать xml-переменную, не возвращаясь к исходному документу, это дает вам ответы, связанные с вопросом.

List<Question> questions = (from xml in xdoc.Descendants("question")
                                    select new Question
                                    {
                                        text = xml.Element("text").Value,
                                        answers =
                                            (from anwsers in xml.Descendants("answer")
                                             select new Answer
                                             {
                                                 Content = anwsers.Element("v").Value
                                             }

                                            ).ToList()
                                    }).ToList();
1 голос
/ 27 апреля 2009

Похоже, проблема в том, что вы начинаете с xdoc в своем внутреннем выборе, если хотите изменить его на:

from answer in xml.Elements("answers").Elements("answer")

С тобой все должно быть в порядке. Это должно работать, потому что XML содержит элемент вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...