2015-03-16 4 views
0

У меня проблема с получением строки из элемента из RSS-ленты.C# Parsing RSS-канал

я получаю ошибку здесь:

XmlNode sizeNode = xmlnode.SelectSingleNode("torrent:contentLength"); 

код работает, если я выхожу из этой строки. вот остальное:

private void button1_Click(object sender, EventArgs e) 
    { 
     var xmlDoc = new XmlDocument(); 
     xmlDoc.Load("movies.xml"); 

     var xmlNode = xmlDoc.SelectSingleNode("//rss/channel"); 
     var i = 0; 
     foreach (XmlNode xmlnode in xmlNode) 
     { 

      XmlNode titleNode = xmlnode.SelectSingleNode("title"); 
      XmlNode categoryNode = xmlnode.SelectSingleNode("category"); 
      XmlNode dateNode = xmlnode.SelectSingleNode("pubDate"); 
      XmlNode sizeNode = xmlnode.SelectSingleNode("torrent:contentLength"); 

      if ((titleNode != null) && (dateNode != null) && 
       (categoryNode != null) && (sizeNode != null)) 
      { 
       DgvMain.Rows.Add(); 
       DgvMain.Rows[i].Cells[1].Value = titleNode.InnerText; 
       DgvMain.Rows[i].Cells[2].Value = categoryNode.InnerText; 
       DgvMain.Rows[i].Cells[3].Value = dateNode.InnerText; 
       DgvMain.Rows[i].Cells[4].Value = sizeNode.InnerText; 
       i++; 
      } 

     } 

здесь является частью из XML-файла:

<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:torrent="http://xmlns.ezrss.it/0.1/"> <channel> 
<title>movies torrents RSS feed - KickassTorrents</title> 
<link>http://kickass.to/</link> 
<description>movies torrents RSS feed</description> 
<item> 
    <title>Al Murray My Gaff My Rules 2003 Xvid Mp3.avi</title> 

    <category>Movies</category> 
    <author>http://kickass.to/user/Stull/</author>  <link>http://kickass.to/al-murray-my-gaff-my-rules-2003-xvid-mp3-avi-t10314315.html</link> 
    <guid>http://kickass.to/al-murray-my-gaff-my-rules-2003-xvid-mp3-avi-t10314315.html</guid> 
    <pubDate>Sat, 07 Mar 2015 00:27:56 +0000</pubDate> 
    <torrent:contentLength>548352170</torrent:contentLength> 
    <torrent:infoHash>EDBA9CB0942265440B3A0AC6FD70B39CD4384E54</torrent:infoHash> 
    <torrent:magnetURI><![CDATA[magnet:?xt=urn:btih:EDBA9CB0942265440B3A0AC6FD70B39CD4384E54&dn=al+murray+my+gaff+my+rules+2003+xvid+mp3+avi&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969%2Fannounce&tr=udp%3A%2F%2Fopen.demonii.com%3A1337]]></torrent:magnetURI> 
    <torrent:seeds>1</torrent:seeds> 
    <torrent:peers>1</torrent:peers> 
    <torrent:verified>0</torrent:verified> 
    <torrent:fileName>al.murray.my.gaff.my.rules.2003.xvid.mp3.avi.torrent</torrent:fileName> 
    <enclosure url="http://torcache.net/torrent/EDBA9CB0942265440B3A0AC6FD70B39CD4384E54.torrent?title=[kickass.to]al.murray.my.gaff.my.rules.2003.xvid.mp3.avi" 

длина = "548352170" Тип = "применение/х-битторрент" />

+1

Какая ошибка вы получаете? Кроме того, можете ли вы разместить образец XML? –

+1

Проблема с пространством имен (torrent), нам нужен образец вашего xml-файла –

+0

я знал, что что-то я забыл :) .. – Shapeshifter

ответ

0

Поскольку contentLength имеет префикс 'torrent:', это вызывает проблемы при попытке извлечь его.

У меня была такая же проблема несколько недель назад.
Моим решением было преобразовать XML-схему в класс, а затем десериализовать данные XML, которые вы извлекли, в объект RSS, и у вас будут все свойства схемы XML.

Шаг 1: Преобразование схемы к классам

Visual Studio предоставляет эту функциональность с помощью:
Правка> Специальная вставка> XML в качестве классов

Другой способ преобразования использует http://xmltocsharp.azurewebsites.net/

Шаг 2: Дезаминировать с помощью XmlSerializer из System.Xml.Serialization;

Шаг 3: Доступ к необходимым свойствам с использованием объекта RSS.

классы будут выглядеть следующим образом:

[XmlRoot(ElementName = "enclosure")] 
public class Enclosure 
{ 
    [XmlAttribute(AttributeName = "url")] 
    public string Url { get; set; } 
    [XmlAttribute(AttributeName = "length")] 
    public string Length { get; set; } 
    [XmlAttribute(AttributeName = "type")] 
    public string Type { get; set; } 
} 

[XmlRoot(ElementName = "item")] 
public class Item 
{ 
    [XmlElement(ElementName = "title")] 
    public string Title { get; set; } 
    [XmlElement(ElementName = "category")] 
    public string Category { get; set; } 
    [XmlElement(ElementName = "author")] 
    public string Author { get; set; } 
    [XmlElement(ElementName = "link")] 
    public string Link { get; set; } 
    [XmlElement(ElementName = "guid")] 
    public string Guid { get; set; } 
    [XmlElement(ElementName = "pubDate")] 
    public string PubDate { get; set; } 
    [XmlElement(ElementName = "contentLength", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string ContentLength { get; set; } 
    [XmlElement(ElementName = "infoHash", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string InfoHash { get; set; } 
    [XmlElement(ElementName = "magnetURI", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string MagnetURI { get; set; } 
    [XmlElement(ElementName = "seeds", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string Seeds { get; set; } 
    [XmlElement(ElementName = "peers", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string Peers { get; set; } 
    [XmlElement(ElementName = "verified", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string Verified { get; set; } 
    [XmlElement(ElementName = "fileName", Namespace = "//kastatic.com/xmlns/0.1/")] 
    public string FileName { get; set; } 
    [XmlElement(ElementName = "enclosure")] 
    public Enclosure Enclosure { get; set; } 
} 

[XmlRoot(ElementName = "channel")] 
public class Channel 
{ 
    [XmlElement(ElementName = "title")] 
    public string Title { get; set; } 
    [XmlElement(ElementName = "link")] 
    public string Link { get; set; } 
    [XmlElement(ElementName = "description")] 
    public string Description { get; set; } 
    [XmlElement(ElementName = "item")] 
    public List<Item> Item { get; set; } 
} 

[XmlRoot(ElementName = "rss")] 
public class KatRss 
{ 
    [XmlElement(ElementName = "channel")] 
    public Channel Channel { get; set; } 
    [XmlAttribute(AttributeName = "version")] 
    public string Version { get; set; } 
    [XmlAttribute(AttributeName = "torrent", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Torrent { get; set; } 
} 

Оставьте любую недвижимость, которую не нужно.