C# XML XDocument

4
我正在用C#编写媒体播放器,因此我将播放列表保存在以下XML格式中:

XML

所以我想获取播放列表“name”的属性和媒体“path”的属性。
我可以使用以下代码获取两者的属性:
var xdoc = XDocument.Load(@"mypath");

var names = from i in xdoc.Descendants("playlist")
            select new
            {
                Path = (string)i.Attribute("name")
            };

var paths = from i in xdoc.Descendants("media")
            select new
            {
                Path = (string)i.Attribute("path")
            };

foreach (var name in names)
{
    System.Diagnostics.Debug.WriteLine(name.Path);
    foreach (var path in paths)
        System.Diagnostics.Debug.WriteLine(path.Path);
}

所以我得到了这个:
电影
E:\Projets\CS - MyWindowsMediaPlayer\Example Medias\Music1.mp3
E:\Projets\CS - MyWindowsMediaPlayer\Example Medias\MusicInfos1.mp3
E:\Projets\CS - MyWindowsMediaPlayer\Example Medias\Video2.mp4
E:\Projets\CS - MyWindowsMediaPlayer\Example Medias\Video1.mp4
E:\Projets\CS - MyWindowsMediaPlayer\Example Medias\Video3.mp4

但是我希望按类别排序,例如只获取与电影对应的链接。


我不能按照你说的做,因为电影不像音乐那样是一个类别,它基本上是播放列表的名称,就像我可以命名为“动作电影”或“塔伦蒂诺电影”。 - Steeven_b
1个回答

4

让我们使用SelectMany和GroupBy的组合。

SelectMany将创建一个包含播放列表名称和媒体路径的元组的单个列表,然后我们使用GroupBy按播放列表名称对此列表进行分组,最后可以使用Where仅过滤具有给定名称的播放列表,例如Films

var xdoc = XDocument.Load(@"mypath");

var paths = xdoc.Descendants("playlist")
                .SelectMany(x => x.Descendants("media"), (pl, media) => Tuple.Create(pl.Attribute("name").Value, media.Attribute("path").Value))
                .GroupBy(x => x.Item1)
                .ToList();

foreach (var name in paths.Where(x => x.Key == "Films"))
{
    Console.WriteLine(name.Key);
    foreach (var tuple in name)
    {
        Console.WriteLine(tuple.Item2);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接