【问题标题】:C# parsing .XSPF (XML) PlaylistC# 解析 .XSPF (XML) 播放列表
【发布时间】:2016-01-11 21:15:58
【问题描述】:

我需要获取“标题”(文件夹)属性的值 以及播放列表中每个标题中的所有“tid”(id)数字 这是.xspf

    <?xml version="1.0" encoding="UTF-8"?>
    <playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
        <title>Playlist</title>
        <trackList>
            <track>
                <location>file:///E:/Downloads/video1.mp4</location>
                <duration>681493</duration>
                <extension application="http://www.videolan.org/vlc/playlist/0">
                    <vlc:id>0</vlc:id>
                </extension>
            </track>
            <track>
                <location>file:///E:/Downloads/video2.mp4</location>
                <duration>614585</duration>
                <extension application="http://www.videolan.org/vlc/playlist/0">
                    <vlc:id>1</vlc:id>
                </extension>
            </track>
            <track>
                <location>file:///E:/Downloads/video3.mp4</location>
                <duration>220629</duration>
                <extension application="http://www.videolan.org/vlc/playlist/0">
                    <vlc:id>2</vlc:id>
                </extension>
            </track>        
        </trackList>
        <extension application="http://www.videolan.org/vlc/playlist/0" xmlns="http://xspf.org/ns/0/">
    <vlc:node title="oooh11111.xspf" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/">
        <vlc:node title="BillyJ">
            <vlc:item tid="0" />
            <vlc:item tid="1" />
            <vlc:item tid="2" />
            <vlc:item tid="3" />
            <vlc:item tid="4" />
            <vlc:item tid="5" />
            <vlc:item tid="6" />
            <vlc:item tid="7" />
            <vlc:item tid="8" />
            <vlc:item tid="9" />
            <vlc:item tid="10" />
            <vlc:item tid="57" />
            <vlc:item tid="58" />
            <vlc:item tid="59" />
        </vlc:node>
        <vlc:node title="Solo">
            <vlc:item tid="60" />
            <vlc:item tid="61" />
            <vlc:item tid="62" />
            <vlc:item tid="63" />
            <vlc:item tid="64" />
            <vlc:item tid="65" />
            <vlc:item tid="66" />
            <vlc:item tid="67" />
            <vlc:item tid="102" />
            <vlc:item tid="103" />
            <vlc:item tid="104" />
        </vlc:node>
        <vlc:node title="Best">
            <vlc:item tid="105" />
            <vlc:item tid="106" />
            <vlc:item tid="107" />
            <vlc:item tid="108" />
            <vlc:item tid="109" />
            <vlc:item tid="110" />
            <vlc:item tid="111" />
        </vlc:node>
</extension>
</playlist>

但现在我需要获取“标题”(文件夹)属性的值 以及每个标题中的所有“tid”(id)数字:
BillyJ
0
1
2
3
4
5
...


独奏
60
61
62
63
64
...

所以我可以按文件的 id 将文件分类到文件夹

这是我解析位置持续时间和 id 的方法:

        class PlaylistItem
        {
            public string location { get; set; }
            public string extensions { get; set; }
            public string duration { get; set; }
        }
        private void button2_Click(object sender, EventArgs e)
        {

            XDocument xdoc = XDocument.Load(@"1.xspf");
            XNamespace ns = ((XElement)xdoc.FirstNode).Name.Namespace;
            XNamespace nx = ("http://www.videolan.org/vlc/playlist/ns/0/");

            List<PlaylistItem> fileSignatures = (from file in xdoc.Descendants(ns+ "track")
                                                  select new PlaylistItem
                                                  {
                                                      location = (string)file.Element(ns + "location").Value,
                                                      extensions = (string)file.Element(ns + "extension").Value,
                                                      duration = (string)file.Element(ns + "duration")
                                                  }).ToList();


            foreach (var item in fileSignatures)
            {
                if (item.duration != null)
                {
                  //Remove %20 (spaces)
                  var file = System.Net.WebUtility.UrlDecode(item.location);
                  //trim file:/// from start
                  char[] trimChar = { 'f', 'i', 'l', 'e','/',':' };
                  file = file.TrimStart(trimChar);
                  listBox1.Items.Add("Duration: " + item.duration + "  id: " + item.extensions);
                  listBox1.Items.Add("File: " + file);
                }
                else
                {

                }
            }


        }

【问题讨论】:

  • stackoverflow.com/questions/55828/how-does-one-parse-xml-files 实际上有很多不同的示例和技术可以做到这一点,如果这篇文章没有提供足够的需求,可以做一个简单的谷歌搜索
  • 是的,我知道,我已经检查了很多地方,但我还没有找到如何解析文件的第二部分,因为我猜它的格式在 xml 中使用得不多:
  • videolan.org/vlc/playlist/ns/0">

标签: c# xml parsing xml-parsing xspf


【解决方案1】:

试试这个。您有两个带有“节点”的标签,只有一个结束标签。

private void button2_Click(object sender, EventArgs e)
        {

            XDocument xdoc = XDocument.Load(FILENAME);
            XElement playlist = (XElement)xdoc.FirstNode;
            XNamespace ns = playlist.Name.Namespace;
            XNamespace nx = ("http://www.videolan.org/vlc/playlist/ns/0/");

            XElement extension = playlist.Elements().Where(x => x.Name.LocalName == "extension").FirstOrDefault();
            XNamespace nsExtension = extension.Name.Namespace;
            XElement node = extension.Elements().Where(x => x.Name.LocalName == "node").FirstOrDefault();

            var nodes = node.Elements().Where(x => x.Name.LocalName == "node").Select(y => new {
                title = y.Attribute("title").Value,
                                ids = y.Elements().Where(x => x.Attribute("tid") != null).Select(x => int.Parse(x.Attribute("tid").Value)).ToList()

        }

【讨论】:

  • 我认为这是一个错误,我不想放整个 .xspf,因为它有 2000 多行,所以我缩短了它,我想我有一个结束标签。但原始文件有正确的数字 od 结束标签。对不起
  • 我在这里得到一个 NullRefrenceException:int.Parse(x.Attribute("tid").Value
  • 对象引用未设置为对象的实例
  • 如果我删除 ids = y.Elements().Select(x => int.Parse(x.Attribute("tid").Value)).ToList() 有效
  • 您必须有一个不带“title”属性的节点标签。对代码进行了一行更改。
猜你喜欢
  • 2016-04-15
  • 2016-03-23
  • 2018-08-12
  • 2013-07-15
  • 2013-10-17
  • 1970-01-01
  • 2011-11-27
  • 2015-09-18
  • 1970-01-01
相关资源
最近更新 更多