2010-04-27 24 views
1

我正尝试使用从SharePoint中的查找列表创建的XML作为树视图的数据源。它是在以下形式:Linq to XML读取并输出从查找列表中生成的XML

<NewDataSet> 
    <test_data> 
    <ID>1</ID> 
    <Title>MenuItem_1</Title> 
    <child_of />  
    </test_data> 
    <test_data> 
    <ID>2</ID> 
    <Title>Subitem_1</Title> 
    <Action>http://www.google.com</Action> 
    <child_of>MenuItem_1</child_of> 
    </test_data> 
    <test_data> 
    <ID>3</ID> 
    <Title>Subitem_2</Title> 
    <Action>http://www.google.com</Action> 
    <child_of>MenuItem_1</child_of> 
    </test_data> 
    <test_data> 
    <ID>4</ID> 
    <Title>MenuItem_2</Title> 
    <child_of /> 
    </test_data> 
    <test_data> 
    <ID>5</ID> 
    <Title>Subitem_2_1</Title> 
    <Action>http://www.google.com</Action> 
    <child_of>MenuItem_2</child_of> 
    </test_data> 
    <test_data> 
    <ID>6</ID> 
    <Title>Subitem_2_2</Title> 
    <Action>http://www.google.com</Action> 
    <child_of>MenuItem_2</child_of> 
    </test_data> 
    <test_data> 
    <ID>7</ID> 
    <Title>Subitem_2_2_1</Title> 
    <Action>http://www.google.com</Action> 
    <child_of>Subitem_2_2</child_of> 
    </test_data> 
</NewDataSet> 

有可为N层,但项涉及通过所述<child_of>元素的父。 我似乎无法弄清楚如何在C#中编写LINQ来正确嵌套菜单项。 朋友推荐我在这里发帖。任何帮助是极大的赞赏。

+0

您正在使用哪个树视图?这是ASP.NET,WinForms,WPF,Silverlight吗?你是否希望从你设置为treeview的数据源的单个LINQ查询中返回结果?或者你想在几行代码中填充treeview? – CoderDennis 2010-05-03 15:37:25

+0

嗨丹尼斯 - 谢谢你的回应。是的,我希望使用单个查询返回Silverlight树视图的数据源。对于所有这些(Silverlight和LINQ),我都是全新的,尽管过去5年来我一直是使用c#的开发人员。 – 2010-05-04 22:31:34

回答

0

你可以做这样的事情,但我会考虑把它放进生产代码。

from n in testData.Elements("test_data") 
        .Aggregate(new Dictionary<string, TreeNode<string>>() 
         {{ string.Empty, new TreeNode<string>() }}, 
         (d, e) => 
         { 
          var curNode = new TreeNode<string>(e.Element("ID").Value); 
          d.Add(e.Element("Title").Value, curNode); 
          d[e.Element("child_of").Value].AddChild(curNode); 
          return d; 
         }) 
        .Values 
where n.Parent == null 
select n; 

请注意,这假定元素具有“空字符串”的父键或来源列表后面的父列表中。

就我个人而言,我会将这个(特别是聚合)分解成它自己的方法。