2009-04-26 66 views
6

我想,以反映我的對象結構的XML樹,但我很LINQ to XML中一個初學者試圖使用LINQ來解析XML樹XML(C#)

我有以下結構的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(); 

當然這樣我每次都會把所有問題中的所有問題都添加到每個列表中。 如何解決這個問題?我可以想象這很簡單,但我不知道:)

先謝謝您!

回答

7

你的代碼不起作用,因爲你找回所有的答案元素,因爲你沒有根據它們來自的問題來限制它們。您可以添加此限制或基於文檔的子查詢,而可以基於問題元素本身來創建子查詢。

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

你應該罰款:

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

使用`LINQ`解析XML有沒有優於使用`XmlDocument`? – Meysam 2012-01-27 05:17:24

1

,如果你要改變它的問題似乎是你在你的內心選擇開始XDOC。這應該工作,因爲XML包含問題元素。

4

你非常接近。在選擇新的部分中,你不需要()在類名之後。你也想使用.Descendents()而不是.Elements()。唯一的其他部分是答案應該是使用xml var不會回到原始文檔,這會給你與問題相關的答案。

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

你上次陳述的含義是什麼?創建對同一個SelectIterator的新引用不會導致它執行查詢。 – Samuel 2009-04-26 23:19:46