0

Questions というカスタム プロパティがあります。コードは以下のとおりです。

public class Questions
{
    private List<Question> _q = new List<Question>();

    public List<Question> Question
    {
        get { return _q; }
    } 
}

public class Question
{
    public string Text { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public string Answer { get; set; }
    private List<string> _Options = new List<string>(); 

    public List<string> Option {
      get { return _Options; }
    }

}

次に、プロパティに以下のコードを入力します

    XmlDocument doc = new XmlDocument();
    Question q = new Question();
    Questions qs = new Questions();
    doc.Load(string.Format(@"questions.xml"));
    XmlNodeList list = doc.SelectNodes("/questions/question");
    foreach (XmlNode node in list)
    {

            q.Text = node.SelectSingleNode("text").InnerText;
            q.Type = node.SelectSingleNode("type").InnerText;
            q.Name = node.SelectSingleNode("name").InnerText;
            XmlNodeList options = doc.SelectNodes("/questions/question/options");
            foreach (XmlNode option in options)
            {
                q.Option.Add(option.SelectSingleNode("option").InnerText);
            }
            load.Visible = false;
            qa.Visible = true;

            qs.Question.Add(q);
            DisplayQuestion(qs);

    }

以下のコードでアクセスしようとすると、期待する出力が得られません。したがって、これは私が助けを必要とするところです。サンプル XML は一番下にあります

                Label1.Text = q.Question[CurrentQ].Text;
                for (int i = 0; i < q.Question[CurrentQ].Option.Count; i++)
                {
                    CheckBoxList1.Items.Add(q.Question[CurrentQ].Option[i]);
                }

XML:

<?xml version="1.0"?>
<questions>
  <question>
    <num>1</num>
    <type>radio</type>
    <text>Do you like cake?</text>
    <options>
      <option>Yes</option>
      <option>No</option>
      <option>Sometimes</option>
    </options>
    <name>cake</name>
  </question>
  <question>
    <num>2</num>
    <type>dropdown</type>
    <text>Do you like TV?</text>
    <options>
      <option>Yes</option>
      <option>No</option>
      <option>Sometimes</option>
    </options>
    <name>tv</name>
  </question>
  <question>
    <num>3</num>
    <type>checkbox</type>
    <text>What do you like?</text>
    <options>
      <option>Cake</option>
      <option>TV</option>
      <option>Flipper Reruns</option>
    </options>
    <name>flipper</name>
  </question>
</questions>

そして出力:

あなたは何が好きですか?

はい

はい

ケーキ

はい

はい

ケーキ

はい

はい

ケーキ

4

2 に答える 2

2

現在のループ内ではdocなく、オプション ノードを選択しています。node

この表現

doc.SelectNodes("/questions/question/options"); 

収量

<options>
  <option>Yes</option>
  <option>No</option>
  <option>Sometimes</option>
</options>
<options>
  <option>Yes</option>
  <option>No</option>
  <option>Sometimes</option>
</options>
<options>
  <option>Cake</option>
  <option>TV</option>
  <option>Flipper Reruns</option>
</options>

このオプション グループのリストから、常にすべてのグループの最初のオプションを取得します。

代わりにこれを試してください

node.SelectNodes("options/option");            

すべてをまとめた

foreach (XmlNode node in list) {
    Question q = new Question(); // As RoXaS pointed out!
    ...
    XmlNodeList options = node.SelectNodes("options/option");
    foreach (XmlNode option in options) {
        q.Option.Add(option.InnerText);
    }
    ...
    qs.Question.Add(q);
}
于 2012-05-01T17:48:57.653 に答える
2

これに対する答えはかなり単純です。エラーは以下のコードにあります。

XmlDocument doc = new XmlDocument();
Question q = new Question();
Questions qs = new Questions();
doc.Load(string.Format(@"questions.xml"));
XmlNodeList list = doc.SelectNodes("/questions/question");
foreach (XmlNode node in list)
{

        q.Text = node.SelectSingleNode("text").InnerText;
        q.Type = node.SelectSingleNode("type").InnerText;
        q.Name = node.SelectSingleNode("name").InnerText;
        XmlNodeList options = doc.SelectNodes("/questions/question/options");
        foreach (XmlNode option in options)
        {
            q.Option.Add(option.SelectSingleNode("option").InnerText);
        }
        load.Visible = false;
        qa.Visible = true;

        qs.Question.Add(q);
        DisplayQuestion(qs);

}

C# は参照によって自動的に機能します (オブジェクトをコピーするのではなく、オブジェクトへのポインターを意味します)。したがって、上記のステートメントで宣言し Question q = new Question(); 、それを入力してリストに追加し、再度入力します。これは、インスタンス化された質問が 1 つだけであるため、結果はすべて同じであることを意味します。

XmlDocument doc = new XmlDocument();

Questions qs = new Questions();
doc.Load(string.Format(@"questions.xml"));
XmlNodeList list = doc.SelectNodes("/questions/question");
foreach (XmlNode node in list)
{
        Question q = new Question(); // <--- Look here

        q.Text = node.SelectSingleNode("text").InnerText;
        q.Type = node.SelectSingleNode("type").InnerText;
        q.Name = node.SelectSingleNode("name").InnerText;
        XmlNodeList options = doc.SelectNodes("/questions/question/options");
        foreach (XmlNode option in options)
        {
            q.Option.Add(option.SelectSingleNode("option").InnerText);
        }
        load.Visible = false;
        qa.Visible = true;

        qs.Question.Add(q);


}
DisplayQuestion(qs); //<-- And here

このようにして、新しい質問が上書きされるのではなく、インスタンス化されてリストに追加されるたびに。questionList では、すべてのエントリは質問オブジェクトの 1 つのインスタンスへのポインタに過ぎないためです。

ああ、なぜ私はDisplayQuestion(qs);そこにダウンを置いたのですか?リスト全体を何度も何度も描きたくないからですか?

Displayquestion 関数が各質問を通過し、正しいコントロールを描画することを確認してください

敬具 ロクサス これがお役に立てば幸いです

于 2012-05-01T17:56:54.357 に答える