2011-04-05 65 views
1

我有一個應該代表一個分層數據結構產生分層XML使用LINQ

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

在我的UI我接人的集合,其中每一個可能有孩子下面的類。 我需要打印出一個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; 
    } 

回答

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現在來測試它,但我希望你能這個想法!

+0

我現在正在嘗試 – Raffaeu 2011-04-05 18:48:27