0

少し問題があります。XML ファイルを解析して、その内容を TreeView に入れようとしています。私はすべてをうまく機能させましたが、1つのことに問題があります。

XML ファイルの例を次に示します。

<AnswerIt>

    <category name="Category 1">
        <question is="Question 1">
            <answer couldbe="Answer 1" />
            <answer couldbe="Answer 2" />
        </question>
    </category>

    <category name="Category 2">
        <question is="Question 1">
            <answer couldbe="Answer 1" />
        </question>
        <question is="Question 2">
            <answer couldbe="Answer 1" />
        </question>
    </category>

</AnswerIt>

XML ファイルを作成するために使用しているコードは、すべてのカテゴリを正常に取得します。質問の部分に到達すると、最初の質問が引っ張られますが、その後は引っ張られません。すべての回答は問題なく取得されます (最初の質問に属している限り)。ここに私のC#コードがあります:

public void LoadQuestionDatabase()
    {
        XmlTextReader reader = new XmlTextReader("http://localhost/AnswerIt.xml");


        TreeNode node = new TreeNode();
        TreeNode subnode = new TreeNode();

        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element && reader.Name == "category")
            {
                node = lstQuestions.Nodes.Add(reader.GetAttribute(0));
                categories.Add(reader.GetAttribute(0));


                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    reader.Read();
                    if (reader.Name == "question")
                    {
                       subnode = node.Nodes.Add(reader.GetAttribute(0));
                        questions.Add(reader.GetAttribute(0));

                        while (reader.NodeType != XmlNodeType.EndElement)
                        {
                            reader.Read();
                            if (reader.Name == "answer")
                            {
                                // add each answer
                                subnode.Nodes.Add(reader.GetAttribute(0).Replace("\t", ""));
                            }
                        }
                    }
                }

            }

        }
        reader.Close();
    }

私はC#があまり得意ではありません。すべての質問をループして追加していない行のどこかを推測しています。私が間違っていることはありますか?私を助けるために読むことができる場所はどこですか?私が読んだすべての例では、ツリービューにルート ノード (AnswerIt) が配置されていますが、それは望ましくありません。

4

2 に答える 2

0
var xDocument = XDocument.Load("http://localhost/AnswerIt.xml");

foreach (var element in xDocument.Descendants("category"))
{
    var node = lstQuestions.Nodes.Add(element.Attribute("name").Value);
    foreach (var subElement in element.Elements("question"))
    {
        var subnode = node.Nodes.Add(subElement.Attribute("is").Value);
        foreach (var answer in subElement.Elements("answer"))
            subnode.Nodes.Add(answer.Attribute("couldbe")
                   .Value.Replace("\t", ""));
    }
}
于 2012-06-22T20:55:47.400 に答える
0

XmlTextReader を使用する代わりに、使用してみてください

XDocument doc = XDocument.Load("http://localhost/AnswerIt.xml");

その場合、すべての要素を手動で構築する必要はありません。

XDocument は、System.Xml.Linqアセンブリと名前空間で提供されます。XDocument に読み込まれると、組み込みメソッドのいずれかを使用してデータを操作できます。

于 2012-06-22T20:46:51.983 に答える