我对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>
/根
感谢您的帮助, 码头
答案 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
。