Рекурсия с использованием XML-литералов в VB.NET это возможно?


У меня есть класс под названием Profile, который имеет некоторые простые свойства, а затем он может иметь набор ProfileItem, который снова имеет некоторые простые свойства, а затем он может иметь набор ProfileItem (рекурсия).

Теперь я пытаюсь создать очень простую функцию сохранения, используя XML-литералы, которые поставляются с VB.NET (3.5).

Я использую следующий код:

  Dim xdoc As XDocument = _
            <?xml version="1.0" encoding="utf-8"?>
            <profiles>
                <%= _
                    From p In _Profiles _
                    Select <profile name=<%= p.Name %>>
                               <%= _
                                   From i In p.GetProfileItems _
                                   Select <item>
                                              <name><%= i.Name %></name>
                                              <action><%= i.Action.ToString %></action>
                                              <type><%= i.Type.ToString %></type>
                                              <arguments><%= i.Arguments %></arguments>
                                              <dependencies>
                                                  <%= _
                                                      From d In i.GetDependencies _
                                                      Select <dependency>
                                                                 <name><%= d.Name %></name>
                                                             </dependency> _
                                                  %>
                                              </dependencies>
                                          </item> _
                               %>
                           </profile> _
                %>
            </profiles>

Часть, связанная с тегом, должна стать рекурсивной, но я этого не делаю узнайте, поддерживается ли он каким-либо образом этим синтаксисом.

Должен ли я переписать все, избегая использования XML-литерала для реализации рекурсии?

1 7

1 ответ:

Рекурсия-одна из причин, почему я люблю VB.NET XML-литералы!

Для выполнения рекурсии требуется функция, которая принимает коллекцию ProfileItems и возвращает элемент XElement. Затем вы можете рекурсивно вызвать эту функцию внутри вашего XML-литерала.

Кроме того, чтобы рекурсия работала, GetProfileItems и GetDependencies должны иметь одно и то же имя (переименовать один из них) и отображать с одинаковой структурой элементов Xml. Вот как может выглядеть рекурсивная функция например:

Function GetProfileItemsElement(ByVal Items As List(Of ProfileItem) As XElement
    Return <items>
               <%= From i In Items _
                   Select <item>
                              <name><%= i.Name %></name>
                              <!-- other elements here -->
                              <%= GetProfileItemsElement(i.GetDependencies) %>
                          </item> %>
           </items>
End Function
Рекурсия завершится, когда вы доберетесь до элемента, который возвращает пустой список для функции GetDependencies. В этом случае вложенный элемент items будет пустым: <items/>. XML-литералы достаточно умны, чтобы объединить начальные и конечные теги items, когда нет никаких дочерних элементов.