Рекурсия с использованием 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 ответ:
Рекурсия-одна из причин, почему я люблю VB.NET XML-литералы!
Для выполнения рекурсии требуется функция, которая принимает коллекцию ProfileItems и возвращает элемент XElement. Затем вы можете рекурсивно вызвать эту функцию внутри вашего XML-литерала.
Кроме того, чтобы рекурсия работала, GetProfileItems и GetDependencies должны иметь одно и то же имя (переименовать один из них) и отображать с одинаковой структурой элементов Xml. Вот как может выглядеть рекурсивная функция например:
Рекурсия завершится, когда вы доберетесь до элемента, который возвращает пустой список для функции GetDependencies. В этом случае вложенный элемент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
items
будет пустым:<items/>
. XML-литералы достаточно умны, чтобы объединить начальные и конечные тегиitems
, когда нет никаких дочерних элементов.