[英]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>
节点中。 但是这段代码无法编译,我无法弄清楚这是怎么回事。 有谁知道我该如何纠正?
好。 我已经部分修复了。 以下作品:
<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 & """, "") %>
请参阅下面的答案。
最终在这篇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
为了完整起见,请在下面查看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.