2012-06-18 115 views
0

我有以下xml,我想獲取具有屬性的節點的值。使用LINQ到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> 
    <mchoice> 
     <question>Launceston is the second largest city in which Australian state?</question> 
     <answer>Victoria</answer> 
     <answer>New South Wales</answer> 
     <answer correct="yes">Tasmania</answer> 
     <answer>Western Australia</answer> 
    </mchoice> 
</quiz> 


public class Question 
{ 
    public string QuestionText { get; set; } 
    public List<string> Answers { get; set; } 
    public string CorrectAnswer { get; set; } 

} 

我嘗試下面的查詢,但我在越來越空CorrectAnswer申請

var questions = from docs in _doc.Descendants("mchoice") 
         let answers = _doc.Elements("answer") 
         select new Question 
         { 
          QuestionText = docs.Element("question").Value, 
          Answers = docs.Elements("answer").Select(a => a.Value).ToList(), 
          CorrectAnswer=docs.Elements("answer").Where(x=>x.Attribute("correct").Value=="yes").Select(x=>x) 

的例外輸出

  • QuestionText,什麼是澳大利亞的首都?
  • 回答名錄

  • CorrectAnswer堪培拉

+0

向我們展示你想要的結果 –

+0

我已經更新了曲注意 –

回答

2

嘗試改變這一行:

CorrectAnswer=docs.Elements("answer").Where(x=>x.Attribute("correct").Value=="yes").Select(x=>x) 

爲:

CorrectAnswer=docs.Elements("answer") 
    .First(x=> x.HasAttributes && x.Attribute("correct").Value=="yes") 
    .Value 
+0

只有一個問題。爲什麼要應用第一種擴展方法? –

+0

因爲你的Where()。Select()返回一個列表,你只需要這個值。實際上,在First()之後應該放入'.Value',我會編輯答案,因爲你可能只想要文本而不是元素。 –

相關問題