Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#XML到达节点_C#_Xml - Fatal编程技术网

c#XML到达节点

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

我需要根据这个条件进行查询。如果“Title”包含单词“Love”,那么我需要获得相关的电影名称

<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
                     }
            );