Возможна рекурсия с 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 Literal для реализации рекурсии?


person Drake    schedule 28.07.2009    source источник
comment
Вау, ведь использование XML-литералов C # просто не выглядит и не кажется правильным.   -  person Nathan W    schedule 28.07.2009


Ответы (1)


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

Для выполнения рекурсии вам нужна функция, которая принимает коллекцию 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 при отсутствии дочерних элементов.

person CoderDennis    schedule 28.07.2009
comment
отличный Деннис, твой ответ мне очень помог - person Drake; 29.07.2009