VB.NET 中的 XML 文字可以递归吗?

发布于 2024-07-28 21:19:19 字数 1972 浏览 6 评论 0原文

我有一个名为 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 Literal 来实现递归?

I have a class called Profile that has some simple properties and then it can have a collection of ProfileItem that again has some simple properties and then it can have a collection of ProfileItem (RECURSION).

Now I am trying to generated a very simple save function using XML Literals that come with VB.NET (3.5).

The code I am using is the following:

  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>

The part related to tag should become recursive, but I don't know if it is in some way supported by this syntax.

Should I rewrite all avoiding usage of XML Literal to implement recursion?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

错々过的事 2024-08-04 21:22:43

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

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

此外,为了使递归正常工作,GetProfileItems 和 GetDependency 需要具有相同的名称(重命名其中之一)并以相同的 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

当您到达为 GetDependency 函数返回空列表的项目时,递归将结束。 在这种情况下,嵌套的 items 元素将为空:。 当没有任何子元素时,XML 文字足够智能,可以组合开始和结束 items 标记。

Recursion is one of the reasons I love VB.NET XML Literals!

In order to do the recursion, you need a function that accepts a ProfileItems collection and returns an XElement. Then you can recursively call that function inside your XML Literal.

Also, in order for the recursion to work, GetProfileItems and GetDependencies need to have the same name (rename one of them) and display with the same Xml Element structure. Here's what the recursive function might look like:

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

The recursion will end when you get to an item that returns an empty list for the GetDependencies function. In that case, the nested items element will be empty: <items/>. XML Literals are smart enough to combine the start and end items tags when there aren't any child elements.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文