格式化由XML文件填充的Treeview的父节点和子节点

时间:2010-05-24 15:14:58

标签: c# asp.net xml treeview

我对xml很新,所以我希望我不会在这里问任何愚蠢的问题。我目前正在从一个非分层结构的XML文件中填充树视图。在我给出的xml文件中,子节点和父节点在item元素的属性中定义。我如何能够利用这些属性,以便树视图以正确的层次结构顺序填充。 (示例Mary Jane应该是Peter Smith的子节点)。目前,所有名字都在彼此之下。

<item parent_id="0" id="1"><content><name>Peter Smith</name></content></item>
<item parent_id="1" id="2"><content><name>Mary Jane</name></content></item>
<item parent_id="1" id="7"><content><name>Lucy Lu</name></content></item>
<item parent_id="2" id="3"><content><name>Informatics Team</name></content></item>
<item parent_id="3" id="4"><content><name>Sandy Chu</name></content></item>
<item parent_id="4" id="5"><content><name>John Smith</name></content></item>
<item parent_id="5" id="6"><content><name>Jane Smith</name></content></item>

/根

感谢您的帮助, 码头

2 个答案:

答案 0 :(得分:2)

以下是使用Linq to XML的解决方案:

    string strXML = @"<root>
        <item parent_id='0' id='1'><content><name>Peter Smith</name></content></item>
        <item parent_id='1' id='2'><content><name>Mary Jane</name></content></item>
        <item parent_id='1' id='7'><content><name>Lucy Lu</name></content></item>
        <item parent_id='2' id='3'><content><name>Informatics Team</name></content></item>
        <item parent_id='3' id='4'><content><name>Sandy Chu</name></content></item>
        <item parent_id='4' id='5'><content><name>John Smith</name></content></item>
        <item parent_id='5' id='6'><content><name>Jane Smith</name></content></item>
        </root>";

    XDocument xDoc = XDocument.Parse(strXML, LoadOptions.None);

    var objData = xDoc.Root.Elements("item").ToList().Select(item =>
        new { id = item.Attribute("id").Value,
              pid = item.Attribute("parent_id").Value,
              tn = new TreeNode(item.Element("content").Element("name").Value)
        }).ToList();

    objData.ForEach(child =>
        {
            var parent = objData.FirstOrDefault(m => m.id == child.pid);
            if (parent != null)
                parent.tn.Nodes.Add(child.tn);
        });
    // Add all nodes with no parent to the TreeView's root:
    objData.Where(n => n.tn.Parent == null).ToList().ForEach(n => treeView1.Nodes.Add(n.tn));

答案 1 :(得分:0)

一种可能的算法是这样的: 1)获取parent_id个节点列表作为唯一集合(记得从所有集合中删除重复项)

2)获取集合中的id属性

3)创建一个新的空“parents”集合

4)对于id集合中的每个项目,如果parent_id集合中存在相应的项目,则该项目是其他项目的父项目。您可以将此ID添加到您创建的新parents集合

5)获得父母列表后,将其绑定到树。这是您的顶级树元素。

6)在此之后,您可以再次浏览id集合,并使用parent_id属性将每个项目添加到其父项

要意识到这不是最有效的实现,因为你在集合中迭代了几次而不是一次性完成所有事情(算法肯定会有所不同)。因此,如果集合很小,那么上面是一个很好的方法。但是你拥有成千上万的物品,多次经过这些物品可能对性能不利。但这种方法实施起来快速而简单。所以请记住权衡。

此外,由于您只是阅读XML而不是操纵它,因此更喜欢XMLReader类而不是XMLDocument