Vb.net 子体上的linq到xml枚举
大家好,我正在阅读一篇教程,试图编写一个简单的linq查询。但我似乎无法让它发挥作用。我试图在附加的xml文档中显示这两个地址,但只能显示第一个地址。有人能帮我弄清楚为什么两个都没有打印出来吗。多谢各位Vb.net 子体上的linq到xml枚举,vb.net,linq-to-xml,Vb.net,Linq To Xml,大家好,我正在阅读一篇教程,试图编写一个简单的linq查询。但我似乎无法让它发挥作用。我试图在附加的xml文档中显示这两个地址,但只能显示第一个地址。有人能帮我弄清楚为什么两个都没有打印出来吗。多谢各位 <?xml version="1.0" encoding="utf-8" ?> <Emails> <Email group="FooBar"> <Subject>Test subject</Subject> <
<?xml version="1.0" encoding="utf-8" ?>
<Emails>
<Email group="FooBar">
<Subject>Test subject</Subject>
<Content>Test Content</Content>
<EmailTo>
<Address>foo@bar.com</Address>
<Address>bar@foo.com</Address>
</EmailTo>
</Email>
</Emails>
Dim steve = (From email In emailList.Descendants("Email") _
Where (email.Attribute("group").Value.Equals("FooBar")) _
Select content = email.Element("EmailTo").Descendants("Address")).ToList()
If Not steve Is Nothing Then
For Each addr In steve
Console.WriteLine(addr.Value)
Next
Console.ReadLine()
End If
受试者
测试内容
foo@bar.com
bar@foo.com
Dim steve=(来自emailList.com(“电子邮件”)中的电子邮件)_
其中(email.Attribute(“group”).Value.Equals(“FooBar”))_
选择content=email.Element(“EmailTo”).subjections(“Address”).ToList()
如果不是,史蒂夫什么都不是
对于steve中的每个地址
控制台写入线(地址值)
下一个
Console.ReadLine()
如果结束
当前查询返回一个列表。这意味着您需要两个嵌套的foreach
循环:一个循环列表,另一个循环IEnumerable的内容
相反,您可以更新LINQ查询以使用该方法并直接获取地址。在查询格式中,SelectMany
使用第二个from
子句表示子查询。这将类似于以下内容:
Dim query = (From email In emailList.Descendants("Email") _
Where (email.Attribute("group").Value.Equals("FooBar")) _
From addr In email.Element("EmailTo").Descendants("Address") _
Select addr.Value).ToList()
If query.Any() Then
For Each addr In query
Console.WriteLine(addr)
Next
End If
此外,如果您只想迭代结果,而不想将结果用作列表用于其他目的,则不需要使用ToList
编辑:为了解释此查询的工作原理,我们将其分为两部分:
第一:
From email In emailList.Descendants("Email") _
Where (email.Attribute("group").Value.Equals("FooBar")) _
这将查询所有
节点,并仅匹配组属性值为“FooBar”的节点
第二:
From addr In email.Element("EmailTo").Descendants("Address") _
Select addr.Value
这是一个子查询,在第一部分(上面)结束的地方继续。它本质上是一种进一步查询原始查询结果的方法。这里我们查询所有
节点,最后,为节点的内部文本选择它们的值。我们需要这样做的原因是子体(“地址”)
返回一个包含所有“地址”元素的IEnumerable
。我们需要执行额外的查询(或foreach
)来迭代这些值并提取它们的值
另一种方法是将其分解为两个查询:
Dim query1 = From email In emailList.Descendants("Email") _
Where (email.Attribute("group").Value.Equals("FooBar"))
Select email.Element("EmailTo").Descendants("Address")
Dim query2 = query1.SelectMany(Function(addr) addr.Select(Function(a) a.Value))
请注意,在query2
中使用了SelectMany
。query2
中的Select
是我前面提到的在IEnumerable
上循环的额外工作。原始查询比query1/query2更清晰,但我写它们只是为了澄清问题。我不完全理解linq语句的工作原理。你能帮我把它分解一下吗?或者给我指一些我可以阅读的资源。我不理解的是第二条from。这怎么能满足我的需要。谢谢你的回答和帮助对不起,刚刚看了返回结果,我期待的结果是Foo@bar.com新线bar@Foo.com我得到的是foo@bar.com新线foo@bar.comwhoops,我的错误我没有包括你的选择声明对不起。答案和广告一样有效,你能解释一下为什么它有效吗。感谢you@gh9在我的帖子中添加了一个解释。希望有帮助!很好的解释,非常感谢!!