Linq到XML-奇怪的结果在哪里
我是Linq新手,当我尝试使用where执行查询时,会得到一些奇怪的结果 xml的示例:Linq到XML-奇怪的结果在哪里,xml,vb.net,linq,linq-to-xml,Xml,Vb.net,Linq,Linq To Xml,我是Linq新手,当我尝试使用where执行查询时,会得到一些奇怪的结果 xml的示例: <movies> <movie id="1"> <scenes> <scene id="1"> <sceneartistsnames> <sceneartistname>Artist A</sceneartistname&g
<movies>
<movie id="1">
<scenes>
<scene id="1">
<sceneartistsnames>
<sceneartistname>Artist A</sceneartistname>
</sceneartistsnames>
</scene>
<scene id="2">
<sceneartistsnames>
<sceneartistname>Artist B</sceneartistname>
</sceneartistsnames>
</scene>
</scenes>
</movie>
<movie id="10">
<scenes>
<scene id="1">
<sceneartistsnames>
<sceneartistname>Artist B</sceneartistname>
<sceneartistname>Artist A</sceneartistname>
</sceneartistsnames>
</scene>
</scenes>
</movie>
</movies>
现在尝试选择艺术家A参与的所有场景
Dim Results = From MovieWithArtist In MoviesXML...<scene> _
Where MovieWithArtist.<sceneartistsnames>.<sceneartistname>.Value = "Artist A" _
Select MovieWithArtist
我只得到一个场景返回,我期待着两个
现在,如果我将XML中的第二个场景更改为:
<movie id="10">
<scenes>
<scene id="1">
<sceneartistsnames>
<sceneartistname>Artist A</sceneartistname>
<sceneartistname>Artist B</sceneartistname>
</sceneartistsnames>
</scene>
</scenes>
</movie>
然后我得到两个场景返回
我做错了什么
谢谢大家。恐怕我不知道VB.NET XML语法,但是这个C很好用:
static void Main()
{
XDocument doc = XDocument.Load("movies.xml");
var query = doc.Descendants("scene")
.Where(scene => scene.Elements("sceneartistsnames")
.Elements("sceneartistname")
.Any(name => name.Value == "Artist A"));
foreach (var scene in query)
{
Console.WriteLine(scene);
}
}
将其转换为对LINQ扩展方法的VB.NET调用应该不难,但恐怕您需要其他人来处理Jared?帮助使用XML特定语法。Jon回答的另一个替代方法是使用selectmany-multiplefrom
var qry = from x in xe.Descendants("scene")
from s in x.Descendants("sceneartistname")
where (string)s == "Artist A"
select string.Format("Movie ID {0} Scene ID {1} : {2}", (int)x.Parent.Parent.Attribute("id"), (int)x.Attribute("id"), (string)s);
为了便于格式化,我将此作为单独的答案发布: 这是Jon的答案,使用转换为VB.Net
你是在尝试拍摄有特定艺术家的电影还是有特定艺术家的场景?你好,奥兰多夫,正在尝试拍摄有特定艺术家的场景。谢谢。谢谢Jon,我的C语言技能很差,但我会尝试将你的解决方案转换为vb.net,谢谢Jon的帮助。谢谢orandov,它工作得很好。我记下乔恩的答案是正确的。还是要谢谢你的帮助。谢谢你。我也应该用这种方式测试。
Private Shared Sub Main()
Dim doc As XDocument = XDocument.Load("movies.xml")
Dim query = doc.Descendants("scene").Where(Function(scene) scene.Elements("sceneartistsnames").Elements("sceneartistname").Any(Function(name) name.Value = "Artist A"))
For Each scene In query
Console.WriteLine(scene)
Next
End Sub