我有一个名为 Profile 的类,它有一些简单的属性,然后它可以有一个 ProfileItem 的集合,它再次具有一些简单的属性,然后它可以有一个集合 ProfileItem (RECURSION)。
现在我尝试使用VB.NET(3.5)附带的XML Literals生成一个非常简单的保存函数。
我使用的代码如下:
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来实现递归?
答案 0 :(得分:9)
递归是我喜欢VB.NET XML Literals的原因之一!
为了进行递归,您需要一个接受ProfileItems集合并返回XElement的函数。然后,您可以在XML Literal中递归调用该函数。
此外,为了使递归起作用,GetProfileItems和GetDependencies需要具有相同的名称(重命名其中一个)并使用相同的Xml Element结构进行显示。这是递归函数的样子:
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 Literals足够聪明,可以在没有任何子元素时组合开始和结束items
标记。