2009-04-26 14 views
6

Chciałbym odzwierciedlają drzewo XML w moim obiektu strukturze, ale jestem zupełnie początkujący w LINQ do XMLPróbując analizować drzewo XML z Linq do XML (C#)

Mam XML o następującej strukturze:

<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> 

... i mam następujące klasy:

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

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

... i mam zbudować następujący (źle) Linq zapytanie:

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

Oczywiście w ten sposób uzyskać za każdym razem wszystkie anwsers ze wszystkich pytań dodane do każdej listy. Jak rozwiązać ten problem? Mogę sobie wyobrazić, że jest to proste, ale nie mam pojęcia :)

Z góry dziękuję!

Odpowiedz

7

Twój kod nie działa, ponieważ odzyskujesz wszystkie elementy odpowiedzi, ponieważ nie ograniczyłeś ich w oparciu o pytanie, z którego pochodzi. Można dodać to ograniczenie lub zamiast podkwerendzie opartej na dokumencie, można dokonać w oparciu o podkwerenda samego elementu zapytania.

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(); 
+0

Czy użycie 'LINQ' do parsowania XML ma jakąkolwiek przewagę nad użyciem' XmlDocument'? – Meysam

1

Problem wydaje się być zaczynasz z xdoc w swoją wewnętrzną wybierz jeśli było go zmienić na:

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

powinno być w porządku. To powinno działać, ponieważ xml zawiera element pytania.

4

Byliście bardzo blisko. W wybranych nowych częściach nie potrzebujesz() po nazwach klas. Również chcesz użyć .Descendents() zamiast .Elements(). Jedyną inną częścią były odpowiedzi, które powinny być przy użyciu xml var nie wracając do oryginalnego dokumentu, to daje odpowiedzi związane z pytaniem.

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(); 
+0

Co masz na myśli przez ostatniego rachunku? Utworzenie nowego odnośnika do tego samego SelectIteratora nie spowoduje wykonania kwerendy. – Samuel

+0

odmienne podejście +1 –

+0

Samuel, aby go przypisać właściwie linia będzie wyglądać mniej więcej tak: List myQuestions = questions.ToList() Tylko dzwoniąc .ToList() lub za pomocą kwerendy w foreach będzie wykonywał. –