2016-01-10 5 views
0

У меня есть список воспроизведения (ы), что мне нужно, чтобы разобрать, и мне нужно, чтобы сделать такие вещи, как установить их в списке и т.д. вот .xspfC# Синтаксический XML (.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"> 
     <vlc:node title="oh.xspf"> 
     <vlc:node title="B"> 
      <vlc:item tid="0"/> 
      <vlc:item tid="1"/>   
     </vlc:node> 
     <vlc:node title="Solo"> 
      <vlc:item tid="2"/>   
     </vlc:node> 
    </extension> 
</playlist> 

И вот код C#, который работает, но я получаю проблемы, так как я использую «node.ChildNode.Item (1) .InnerText« у некоторых файлов больше метаданных, чем просто «местоположение» «продолжительность». , но я не могу показаться, чтобы получить работу, используя имя элемента, чтобы получить информацию я хочу

private void button1_Click(object sender, EventArgs e) 
     { 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.Load("1.xspf"); 
      XmlNodeList nodeList = xmlDoc.GetElementsByTagName("track"); 
      string proID = "", proName = ""; 
      foreach (XmlNode node in nodeList) 
      { 
        proID = node.ChildNodes.Item(1).InnerText;//ChildNodes.Item(1).InnerText; 
        //proName = node.SelectSingleNode("duration").InnerText; 
        listBox1.Items.Add(proID); 


      }  
     } 

ответ

0

Использование XML LINQ, как показано ниже. Добавить с помощью System.Xml.Linq; в верхней части модуля

 const string FILENAME = @"c:\temp\test.xml"; 
     XDocument doc = XDocument.Load(FILENAME); 
     XNamespace ns = ((XElement)doc.FirstNode).Name.Namespace; 
     var data = doc.Descendants(ns + "track").Select(x => new object[] { 
      (string)x.Element(ns + "location"), 
      (int)x.Element(ns + "duration"), 
      int.Parse(x.Element(ns + "extension").Value), 
      (string)x.Element(ns + "extension").Attribute("application") 
     }).ToList(); 

     foreach (object prodID in data) 
     { 
      listBox1.Items.Add(prodID); 
     } 
+0

Благодаря jdweng, что работает это "расширение" разве нуль, но получает ошибка это NULL. – Shapeshifter

+0

Но я получил его для работы с небольшим количеством переформатированных сообщений за него в сек. – Shapeshifter

+0

Я вижу изменения. Отлично, что вы его работали. не знал, какие поля из xml вам нужны, поэтому я вытащил все и поместил его в объект []. – jdweng

0

Это работает:

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; 
 

 
      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) 
 
       { 
 
        listBox1.Items.Add("Duration: " + item.duration + " id: " + item.extensions); 
 
        listBox1.Items.Add("File: " + item.location); 
 
       } 
 
       else 
 
       { 
 
        
 
       } 
 
      } 
 

 

 
     }