根据 2 个值使用 Linq 分析 XML

本文关键字:Linq 分析 XML 根据 | 更新日期: 2023-09-27 18:32:32

我想知道如何使用 LinQ 在 c# 中解析我的 xml 文件,我做了很多研究,但没有我的确切案例。

所以这是我的 xml 代码:

<WindowsMediaPlayer>
  <Playlist name="playlistdefouf">
    <Element>
        <type>Audio</type>
        <name>lol</name>
    </Element>
        <Element>
        <type>Video</type>
        <name>tamere</name>
    </Element>
  </Playlist>
</WindowsMediaPlayer>

我也想创建一个函数,根据正确的播放列表验证歌曲是否存在(类型为 AND 名称)。

例如,如果我输入参数播放列表名称 = "播放列表defouf",类型 = "音频"并且名称 = "lol",我的函数将返回 1

我已经尝试做某事,但我想我迷路了。

XDocument xmlFile = XDocument.Load(Helper.xmlFolder + "/playlist.xml");
IEnumerable<XElement> elem = xmlFile.Root.Descendants();
IEnumerable<XElement> requete = from d in elem
                    where d.Name == "Playlist"
                    && d.Attribute("name").Value == "playlistdefouf"
                    select d;
IEnumerable<XElement> requete2 = from d in requete.Descendants()
                                where d.Name == "Element"
                                select d;
IEnumerable<XElement> requete3 = from d in requete2.Descendants()
                                    select d;

根据 2 个值使用 Linq 分析 XML

以下是检索具有特定类型和名称的播放列表的 IEnumerable 的方法:

XDocument xmlFile = XDocument.Load("playlists.xml");
var res = from playlist in xmlFile.Root.Elements("Playlist")
    where
        playlist.Attribute("name").Value == "playlistdefouf" &&
        playlist.Element("Element").Element("type").Value == "Audio" &&
        playlist.Element("Element").Element("name").Value == "lol"
    select playlist;

您可以使用Count()扩展方法获取播放列表的计数

res.Count();

或者,如果您想知道列表是否包含与参数匹配的任何元素,则可以使用 Extension 方法Any()而不是 Count 来获取更具表现力的布尔值。

这会产生相同的结果,但我个人更喜欢这样构建:

var xml = XDocument.Load("playlist.xml");
var result =  from playlist in xml.Descendants("Playlist")
              where (string)playlist.Attribute("name") == "playlistdefouf"
              from song in playlist.Descendants("Element")
              where (string)song.Element("type") == "Audio" && (string)song.Element("name") == "lol"
              select playlist;

然后,您可以使用 IEnumerable 扩展来获取所需的结果:

var count = result.Count();
var isExisting = result.Any();
var playlist = result.ToList();