VB.NET中使用XML字面量进行递归是可行的吗?

7

我有一个名为Profile的类,它有一些简单的属性,然后它可以有一个ProfileItem集合,其中再次具有一些简单的属性,然后它可以有一个ProfileItem集合(递归)。

现在我正在尝试使用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文字来实现递归?


哇,自从开始使用C#的xml文本,就感觉不太对劲了。 - Nathan W
1个回答

10

递归是我喜欢 VB.NET XML Literals 的原因之一!

为了进行递归,您需要一个接受 ProfileItems 集合并返回 XElement 的函数。然后,您可以在 XML Literal 中递归调用该函数。

此外,为了使递归正常工作,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 标记。

很棒,Dennis,你的回答帮了我很多。 - Drake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接