将数据从XML文件拖入TreeView项(C#)

时间:2012-06-22 20:39:28

标签: c# windows treeview xmlreader

我有点问题。我正在尝试解析XML文件并将其内容放入TreeView中。我把一切都搞定了,但是我遇到了一件事。

以下是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)放在树视图中,我不希望这样。

2 个答案:

答案 0 :(得分:0)

尝试使用

而不是使用XmlTextReader

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

然后您不必手动构建所有元素。

System.Xml.Linq程序集和命名空间中提供了XDocument。一旦将其加载到XDocument中,您就可以使用其内置的任何方法来操作数据。

答案 1 :(得分: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", ""));
    }
}