繁体   English   中英

在XML文字中嵌套Linq

[英]Nesting Linq in XML Literals

通过三级类层次结构(人,孩子,玩具:一个人有一个或多个孩子,每个孩子有一个或多个玩具),一个人如何使用XML Literals将其导出到XML? 我正在使用以下代码( p是作为参数传入的Person对象):

Dim X = <Person Name=<%= p.Name %>>
  <%= From k In p.GetKids()
      Select <Kid Name=<%= k.Name %>>
      <%= From t In k.GetToys()
          Select <Toy Name=<%= k.Name %> <%= IIf(t.IsBatteryOperated(), "Batteries=""" & t.BatteriesCount & """, "") %> />
  </Kid>
</Person>

我在这里尝试两件事。 我试图将一种LINQ-2-XML嵌套在另一种中。 其次,我试图添加一个可选属性“ Batteries ,该属性仅出现在由Batteries<Toy>节点中。 但是这段代码无法编译,我无法弄清楚这是怎么回事。 有谁知道我该如何纠正?

UPDATE

好。 我已经部分修复了。 以下作品:

<Person Name=<%= p.Name %>>
  <%= From k In p.GetKids()
      Select <Kid Name=<%= k.Name %>>
        <%= From t In k.GetToys()
            Select <Toy Percentage=<%= t.Name %> /> %>
      </Kid> %>
</Person>

上面的代码可以正常编译,但是一旦我尝试添加可选属性,它就会再次开始抱怨。 因此,现在剩下的唯一问题是要在<Toy>节点内以某种方式添加以下表达式:

<%= IIf(t.IsBatteryOperated(), "Batteries=""" & t.BatteriesCount & """, "") %>

更新2

请参阅下面的答案。

最终在这篇SO帖子的帮助下弄清楚了。 对于其他需要它的人,您只需要通过内部linq-2-xml调用中的投影来创建XElement

<Person Name=<%= p.Name %>>
  <%= From k In p.GetKids()
      Select <Kid Name=<%= k.Name %>>
        <%= From t In k.GetToys()
            Select New XElement("Toy",
                       New XAttribute("Name", t.Name),
                       AttributeOrNull("Batteries", If(t.IsBatteryOperated(), Nothing, t.BatteriesCount))) %>
      </Kid> %>
</Person>

其中AttributeOrNull()是以下定义的辅助函数:

Public Shared Function AttributeOrNull(name As XName, value As String) As XAttribute
    Return If(String.IsNullOrEmpty(value), Nothing, New XAttribute(name, value))
End Function

UPDATE

为了完整起见,请在下面查看Jeff的答案。 如他的回答所述,可以通过使用声明性语法使上面的代码更小/更精细。

您可以通过以下方式获得更好的语法:

<Person Name=<%= p.Name %>>
  <%= From k In p.GetKids
      Select
        <Kid Name=<%= k.Name %>>
          <%= From t In k.GetToys
              Select 
                <Toy
                  Percentage=<%= t.Name %>
                  <%= If(t.IsBatteryOperated, New XAttribute("Batteries", t.BatteriesCount), Nothing) %>
                />
          %>
        </Kid>
  %>
</Person>

我认为您的编码问题是由未深思熟虑的XML结构引起的。 基本材料应放在元素中。 在我看来,所有数据都是必不可少的。 如果您采用的结构看起来更像这样,

<parents>
    <parent>
        <pname></pname>
        <kids>
            <kid>
                <kname></kname>
                <toys>
                    <toy>
                        <tname></tname>
                        <batteries>
                            <type>
                                <count></count>
                            </type>
                        </batteries>
                    </toy>
                </toys>
            </kid>
        </kids>
    </parent>
</parents>

您的编码问题变得更加简单,XML更加清晰。 如果电池元素为空或计数为零,则玩具不需要电池。

例:

<parents>
    <parent>
        <pname>Joe Parent</pname>
        <kids>
            <kid>
                <kname>Sally</kname>
                <toys>
                    <toy>
                        <tname>Remote Contolled Car</tname>
                        <batteries>
                            <type>D
                                <count>2</count>
                            </type>
                            <type>AA
                                <count>4</count>
                            </type>
                        </batteries>
                    </toy>
                </toys>
            </kid>
            <kid>
                <kname>Sam</kname>
                <toys>
                    <toy>
                        <tname>Teddy Bear</tname>
                        <batteries>
                            <type>none
                                <count>0</count>
                            </type>
                        </batteries>
                    </toy>
                </toys>
            </kid>
        </kids>
    </parent>
</parents>

我有一个基于XML的系统,带有80多种不同类型的标签。 其中只有一个具有定义的属性,我仍然质疑它是否应该是标签。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM