![](/img/trans.png)
[英]Returning multiple xml Children with same name on single node using linq c#
[英]Returning multiple xml Children with same name in linq
我有以下XML並希望將所有“Answers”子項作為List返回
<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<Answer> Answers { get; set; }
}
public class Answer
{
public string Answer1 { get; set; }
public string Answer2 { get; set; }
public string Answer3 { get; set; }
public string Answer4 { get; set; }
}
我嘗試了以下linq查詢,但我被困在Answer字段中
public IEnumerable<Question> GetAll()
{
var questions = from docs in _doc.Descendants("mchoice")
select new
{
QuestionText = docs.Element("question").Value,
Answers = docs.Descendants("answer").SelectMany(e=>e.Element("answer").Value)
};
return questions;
}
把你的班級換成
public class Question
{
public string QuestionText { get; set; }
public List<string> Answers { get; set; }
}
然后你的查詢將是
var questions = from docs in _doc.Descendants("mchoice")
select new Question
{
QuestionText = docs.Element("question").Value,
Answers = docs.Elements("answer").Select(a=>a.Value).ToList()
};
我不太確定你的實體結構是否正確。 您似乎有一個List類型的Answers屬性,每個答案實體再次有4個(總是4?)答案!
我想,改變它會更有意義。
public class Question
{
public string QuestionText { get; set; }
public List<Answer> Answers { get; set; }
public Question()
{
if (Answers == null)
Answers = new List<Answer>();
}
}
public class Answer
{
public string Answer1 { get; set; }
}
您可以編寫一個方法,通過讀取XML來返回問題列表(帶有答案)
public static IEnumerable<Question> GetAll(XElement elm)
{
var allQA = new List<Question>();
var mchoices = elm.Descendants("mchoice").ToList();
foreach (var choice in mchoices)
{
var answers = choice.Descendants("answer").ToList();
var qA = new Question { QuestionText = choice.Descendants("question").SingleOrDefault().Value };
foreach (var answer in answers)
{
qA.Answers.Add(new Answer { Answer1 = answer.Value});
}
allQA.Add(qA);
}
return allQA;
}
無論我想要什么,我都可以這樣稱呼它
XElement elm = XElement.Load(Server.MapPath(@"../YourFolder/sample.xml"));
//You can alternatively load from string/stream etc..
if (elm != null)
{
var questionList=GetAll(elm);
}
嘗試改變這個:
Answers1 = docs.Descendants("answer").SelectMany(e=>e.Element("answer").Value)
對此:
Answers1 = docs.Descendants("answer").SelectMany(e=>e.Value)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.