使用Linq生成分层XML

时间:2011-04-05 18:29:11

标签: recursion linq-to-xml

我有以下类应该代表分层数据结构

class Person
{
   int Id { get; set; }
   Person Parent { get; set; }
   List<Person> Children { get; set; }
}

在我的用户界面中,我收到了一个人员集合,每个人都有孩子。 我需要打印出具有以下结构的XML:

<root>
   <Person id="1" parent_id="0" name="">
      <Person id="5" parent_id="1" name="">
         <Person id="10" parent_id="5" name="">
         </Person>
      </Person>
      <Person id="6" parent_id="1" name="">
      </Person>
   </Person>
   <Person id="2" parent_id="0" name="">
   </Person>
</root>

现在我写了这个,但我的代码不是递归的。 你能帮我用LINQ完成这项工作吗?

    public XDocument GetHtmlWorkbookTree(List<Person> persons)
    {
        var document = new XDocument();
        var root = new XElement("Person",
            persons.Select(
            r => new XElement("Person",
                new XAttribute("id", r.Id))));
        document.Add(root);
        return document;
    }

1 个答案:

答案 0 :(得分:2)

这不是什么大不了的事,它和任何递归一样。只需将XElement传递给递归函数。

我在想这样的事情:

public XDocument GetHtmlWorkbookTree(List<Person> persons)
    {
        var document = new XDocument();
        Person rootperson = persons.SingleOrDefault( ... select the person that you want to start with ... );
        var root = new XElement("Person", ... fill with attributes as you like ...);
        document.Add(root);

        foreach(var item in rootperson.Children)
        {
             AddChildRecursive(root, rootperson);
        }

        return document;
    }

public void AddChildRecursive(XElement element, Person person)
{
    foreach(var item in person.Children)
    {
        XElement newchild = new Element("Person", ... fill with attributes as you like ...);
        element.Add(newchild);
        AddChildRecursive(newchild, item);
    }
}

我不确定这会不会有效,因为我现在没有VS测试它,但我希望你明白这个想法!