1

次の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<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; }
}

次の統合言語クエリを試しましたが、回答フィールドでスタックしています

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;

    }
4

3 に答える 3

2

クラスを次のように変更します

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

                        };
于 2012-06-18T17:22:51.317 に答える
1

論理的にあなたのエンティティ構造が正しいかどうかはよくわかりません。タイプ 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);
}
于 2012-06-18T17:30:49.237 に答える
0

これを変更してみてください:

Answers1 = docs.Descendants("answer").SelectMany(e=>e.Element("answer").Value)

これに:

Answers1 = docs.Descendants("answer").SelectMany(e=>e.Value)

于 2012-06-18T17:04:48.053 に答える