Генерация иерархического XML с Linq - PullRequest
1 голос
/ 05 апреля 2011

У меня есть следующий класс, который должен представлять иерархическую структуру данных

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

В моем пользовательском интерфейсе я получаю коллекцию Person, у каждого из которых могут быть дети.Мне нужно распечатать 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 Ответ

2 голосов
/ 05 апреля 2011

Это не так уж важно, это то же самое, что и любая рекурсия. Просто передайте 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, чтобы проверить его, но я надеюсь, что вы поняли!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...