2016-01-10 61 views
0

我有一個播放列表(S),我需要解析,我需要做的東西一樣在列表框等 這裏設置它們是.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 
 
       { 
 
        
 
       } 
 
      } 
 

 

 
     }