2

questionC# を使用してとの値を取得したいのですanswerが、その前に必要な ID を取得したいと考えています。私はこのXMLを使用しています:

<root>
  <information>
    <name>Tasks</name>
    <date>15-05-2005</date>
  </information>
  <tasks>
      <task>
        <id>1</id>
        <question>Here comes question 1</question>
        <answer>Answer 1</answer>
      </task>
      <task>
        <id>2</id>
        <question>Here comes question 2</question>
        <answer>Answer 2</answer>
      </task>
      <task>
        <id>3</id>
        <question>Here comes question 3</question>
        <answer>Answer 3</answer>
      </task>
</root>

C# コード:

XDocument tasks;
int TheIdINeed = 2;
string quest = "";
string answ = "";

フォームのロード時:

tasks = XDocument.Load(leveltoload);
var status = tasks.Element("level").Element("information");
quest = tasks.Element("root").Element("tasks").Element("task").Element("question").Value; // It returns me the first task data, but I need to load data with required Id (int TheIdINeed = ...)

すみません、私の英語はうまくありません。

4

3 に答える 3

3

あなたはこれを使うことができます

string id = "2";
var qa = doc.Descendants("tasks").Elements("task")
                       .Where(x => x.Element("id").Value == id).FirstOrDefault();
if (qa != null)
{
   var question = qa.Element("question").Value;
   var answer = qa.Element("answer").Value;
}

この範囲外で質問と回答を取得する必要がある場合は、データを保持するクラスを作成することをお勧めします。例えば、

public class QuestionAnswer
{
    public string ID { get; set; }
    public string Question { get; set; }
    public string Answer { get; set; }
}


var qa = doc.Descendants("tasks").Elements("task")
            .Where(x => x.Element("id").Value == id)
            .Select(x => new QuestionAnswer() 
                    {
                      ID = "2",
                      Question = x.Element("question").Value,
                      Answer = x.Element("answer").Value
                    });

辞書を使用して質問/回答のペアを保存することで上記を改善できますが、これはアイデアを提供するための単なる例です。QuestionAnswer クラスがこれらの 2 つのプロパティよりも複雑な場合に備えて。

于 2013-08-11T10:46:12.170 に答える
1

すべてのデータをディクショナリに取得できるため、文字列への変換を繰り返す必要はありません

var res = tasks.Descendants("task")
    .Select(x => x.Elements().ToDictionary(e => e.Name.ToString(), e => (string)e.Value))
    .FirstOrDefault(x => x["id"] == id);

res["question"]
res["answer"]

ただし、xml に質問や回答のないタスクがある場合は、値を取得する前に res にキーが含まれているかどうかを確認するか、TryGetValue を使用する必要があります。

string question;
res.TryGetValue("question", out question);
于 2013-08-11T11:01:27.373 に答える