c#XML到达节点
我需要根据这个条件进行查询。如果“Title”包含单词“Love”,那么我需要获得相关的电影名称c#XML到达节点,c#,xml,C#,Xml,我需要根据这个条件进行查询。如果“Title”包含单词“Love”,那么我需要获得相关的电影名称 <mmReply command="getSongsByQuery" userData="hello" status="ok"> <contents> <songList recordCount="3"> <song songId="83"> <field id="12" name="Run Time">03:42</fi
<mmReply command="getSongsByQuery" userData="hello" status="ok">
<contents>
<songList recordCount="3">
<song songId="83">
<field id="12" name="Run Time">03:42</field>
<field id="102" name="Artist">Ten Years After</field>
<field id="103" name="Title">I'd Love To Change The World</field>
<field id="104" name="Movie">Movie Name</field>
</song>
<song songId="81">
<field id="12" name="Run Time">03:08</field>
<field id="102" name="Artist">Stephen Stills</field>
<field id="103" name="Title">Love The One You're With</field>
<field id="104" name="Movie">Movie Name</field>
</song>
<song songId="54">
<field id="12" name="Run Time">05:30</field>
<field id="102" name="Artist">Led Zeppelin</field>
<field id="103" name="Title">Whole Lotta</field>
<field id="104" name="Movie">Movie Name</field>
</song>
</songList>
使用LINQ to XML很容易做到这一点(因为您已经在代码中使用了它),如下所示:
var songs = data.XPathSelectElements("/mmReply/contents/songList/song/field[@name='Title']")
.Where(x => x.Value.Contains("Love"))
.Select(x => new {
songID = x.Parent.Attribute("songId").Value,
movieName = x.Parent.XPathSelectElement("field[@name='Movie']").Value
}
);
在此示例中,数据
是加载xml内容的实例(请注意,示例xml格式不正确,因为它缺少
和
结束标记)
注意这里我创建匿名类型的IEnumerable只是为了简单,你应该创建你的
SongInfo
实例。那么你有没有尝试过任何方法来解决你的问题?什么不起作用?你的密码在哪里?你有例外吗?我在上面编辑。。添加了我不知道如何从XML@andykorneyevf节点获取电影的代码,该节点的标题需要转到父节点,然后它的子节点的属性为movie以获取内部文本。或者只需查看具有标题的节点的同级,即可找到正确的项。您是否从算法的角度考虑过什么是必要的?您是否尝试过这两种方法中的任何一种?您确定要在与您的示例具有相同结构的xml数据上测试它吗?因为从您的示例xml(如我所述,添加了missed close标记)中,此代码在我的计算机上输出两个元素songId 83和81及其电影名称。我有结束标记,但相同的xml仍然没有得到..:(空值,我可以假设的唯一原因是,数据是XElement
而不是XDocument
。在这种情况下,第一个XPathSelectElements
表达式的XPath应该是“contents/songList/song/field[@name='Title']”
因为在本例中,元素mmReply
本身就是数据
本身。我将上述代码用作“data.XPathSelectElements(“contents/songList/song/field[@name='Title'])进行测试,我在歌曲“{System.Linq.Enumerable.whereselectEnumerableInterator}”中得到了它正如我在回答中提到的-你不需要匿名类型,我写它只是为了举例说明(因为我这里没有你的SongInfo
类,不能用它编译)。你需要创建新的SongInfo
并在中填充它的字段。选择
var songs = data.XPathSelectElements("/mmReply/contents/songList/song/field[@name='Title']")
.Where(x => x.Value.Contains("Love"))
.Select(x => new {
songID = x.Parent.Attribute("songId").Value,
movieName = x.Parent.XPathSelectElement("field[@name='Movie']").Value
}
);