0

这是我正在使用的测试 xml:

<categories>
<category id="1" name="Test1">
    <category id="2" name="Test2">
        <misc id="1"></misc>
    </category>
</category>    
<category id="3" name="Test3">
    <misc id="2"></misc>
</category>    

现在我想将它绑定到一个 ASPX 树视图,我只想要具有名称类别的元素,并且我希望这些元素的名称出现在树视图中。

很容易获得 id 和名称:

var d = from t in data.Descendants("category") 
   select new { ID = t.Attribute("id").Value, Name = t.Attribute("name").Value };

但是我如何将结构保留在树视图中?

这应该是这样的:

测试1

-> 测试2

测试3

4

2 回答 2

1

如果我理解正确,也许是这样的?(我没有测试过)

class Category
{
    public string ID { get; set; }
    public string Name { get; set; }
    public IEnumerable<Category> SubCategories { get; set; }
}

IEnumerable<Category> CategoryTreeStructure(XElement e)
{
   var d = from t in e.Elements("category")
           select new Category()
           { 
               ID = t.Attribute("id").Value, 
               Name = t.Attribute("name").Value,
               SubCategories = CategoryTreeStructure(t)
           };

   return d;
}

调用它:

var structure = CategoryTreeStructure(doc.Root);

“我只想要具有名称类别的元素” - 我不明白你的意思是什么?但是,如果您只想选择那些具有“名称”属性的元素,那么这应该有效:

   ...
   var d = from t in e.Elements("category")
           where t.Attribute("name") != null
           select new Category()
           ...

我知道上部(“名称”属性部分)不是您想要的,但我把它留在那里。我已经针对以下代码测试了代码:

XDocument doc = XDocument.Parse(@"<categories>
<category id=""1"" name=""Test1"">
    <category id=""2"" name=""Test2"">
        <misc id=""1""></misc>
    </category>
</category>    
<category id=""3"" name=""Test3"">
    <misc id=""2""></misc>
</category>  
</categories>");
            var structure = CategoryTreeStructure(doc.Root);
于 2010-06-24T21:04:21.933 回答
0

实际上,我找到了这个链接,它完全符合您的要求:) 而且它没有 LINQ,所以我认为它应该得到另一个答案。

http://www.15seconds.com/issue/041117.htm

于 2010-06-24T21:21:09.310 回答