2008-11-26 16 views
34

.NET 3.5 के साथ, एक सिंडिकेशन फीड है जो आरएसएस फ़ीड में लोड होगा और आपको LINQ चलाने की अनुमति देगा।सिंडिकेशन में गैर-मानक तत्वों को पढ़ना सिंडिकेशन फीड

यहाँ आरएसएस का एक उदाहरण है कि मैं लोड हो रहा हूं:

<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"> 
<channel> 
    <title>Title of RSS feed</title> 
    <link>http://www.google.com</link> 
    <description>Details about the feed</description> 
    <pubDate>Mon, 24 Nov 08 21:44:21 -0500</pubDate> 
    <language>en</language> 
    <item> 
     <title>Article 1</title> 
     <description><![CDATA[How to use StackOverflow.com]]></description> 
     <link>http://youtube.com/?v=y6_-cLWwEU0</link> 
     <media:player url="http://youtube.com/?v=y6_-cLWwEU0" /> 
     <media:thumbnail url="http://img.youtube.com/vi/y6_-cLWwEU0/default.jpg" width="120" height="90" /> 
     <media:title>Jared on StackOverflow</media:title> 
     <media:category label="Tags">tag1, tag2</media:category> 
     <media:credit>Jared</media:credit> 
     <enclosure url="http://youtube.com/v/y6_-cLWwEU0.swf" length="233" type="application/x-shockwave-flash"/> 
    </item> 
</channel> 

जब मैं पाश आइटम के माध्यम से, मैं वापस शीर्षक और SyndicationItem की सार्वजनिक संपत्तियों के माध्यम से लिंक मिल सकता है।

मुझे यह पता लगाना प्रतीत नहीं होता कि संलग्नक टैग के गुण, या मीडिया टैग के मान कैसे प्राप्त करें। मैंने

SyndicationItem.ElementExtensions.ReadElementExtensions<string>("player", "http://search.yahoo.com/mrss/") 

इनमें से किसी के साथ कोई मदद करने का प्रयास किया?

उत्तर

7

आपका नामस्थान खो रहा है। (मीडिया तत्व + ":

string xml = @" 
    <rss version='2.0' xmlns:media='http://search.yahoo.com/mrss/'> 
    <channel> 
     <title>Title of RSS feed</title> 
     <link>http://www.google.com</link> 
     <description>Details about the feed</description> 
     <pubDate>Mon, 24 Nov 08 21:44:21 -0500</pubDate> 
     <language>en</language> 
     <item> 
      <title>Article 1</title> 
      <description><![CDATA[How to use StackOverflow.com]]></description> 
      <link>http://youtube.com/?v=y6_-cLWwEU0</link> 
      <media:player url='http://youtube.com/?v=y6_-cLWwEU0' /> 
      <media:thumbnail url='http://img.youtube.com/vi/y6_-cLWwEU0/default.jpg' width='120' height='90' /> 
      <media:title>Jared on StackOverflow</media:title> 
      <media:category label='Tags'>tag1, tag2</media:category> 
      <media:credit>Jared</media:credit> 
      <enclosure url='http://youtube.com/v/y6_-cLWwEU0.swf' length='233' type='application/x-shockwave-flash'/> 
     </item> 
    </channel> 
    </rss> 
    "; 



XElement rss = XElement.Parse(xml); 
XNamespace media = "http://search.yahoo.com/mrss/"; 

var player = rss.Element("channel").Element("item").Element(media + "player").Attribute("url"); 
player.Dump(); 

परिणाम: url =" http://youtube.com/?v=y6_-cLWwEU0 "

निर्माण पर है देखने के लिए LINQPad और अपने उदाहरण फ़ीड का उपयोग करना प्लेयर ") जो लिंक को 'मीडिया' के साथ-साथ तत्व नाम 'प्लेयर' द्वारा प्रदर्शित नामस्थान का उपयोग करने के लिए कहता है।

मेरे भाग पर मस्तिष्क क्षति स्थापित होनी चाहिए, मैंने सोचा था कि आप लिंक का उपयोग कर रहे थे। वैसे भी, आपको नामस्थान को ध्यान में रखना होगा।

+1

उत्तर के लिए धन्यवाद। एकमात्र चीज जो मैं चाहता हूं वह स्ट्रिंग्स के बजाय दृढ़ता से टाइप किए गए नामों को रखेगी। – Jared

10

आप फ़ीड आइटम के सिंडिकेशन एक्सटेंशन निकालने के लिए LINQ और XPathNavigator के संयोजन का उपयोग कर सकते हैं (एक्सटेंशन के नामस्थान यूआरआई के आधार पर)। आइटम बाड़ों के लिए, आप उन लिंक के लिए आइटम लिंक संग्रह की जांच करना चाहेंगे जिनके पास संलग्नक का रिलेशनशिप टाइप है।

उदाहरण:

HttpWebRequest webRequest = WebRequest.Create("http://www.pwop.com/feed.aspx?show=dotnetrocks&filetype=master") as HttpWebRequest; 

using (Stream stream = webRequest.GetResponse().GetResponseStream()) 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.IgnoreComments  = true; 
    settings.IgnoreWhitespace = true; 

    using(XmlReader reader = XmlReader.Create(stream, settings)) 
    { 
     SyndicationFeed feed = SyndicationFeed.Load(reader); 

     foreach(SyndicationItem item in feed.Items) 
     { 
      // Get values of syndication extension elements for a given namespace 
      string extensionNamespaceUri   = "http://www.itunes.com/dtds/podcast-1.0.dtd"; 
      SyndicationElementExtension extension = item.ElementExtensions.Where<SyndicationElementExtension>(x => x.OuterNamespace == extensionNamespaceUri).FirstOrDefault(); 
      XPathNavigator dataNavigator   = new XPathDocument(extension.GetReader()).CreateNavigator(); 

      XmlNamespaceManager resolver = new XmlNamespaceManager(dataNavigator.NameTable); 
      resolver.AddNamespace("itunes", extensionNamespaceUri); 

      XPathNavigator authorNavigator  = dataNavigator.SelectSingleNode("itunes:author", resolver); 
      XPathNavigator subtitleNavigator = dataNavigator.SelectSingleNode("itunes:subtitle", resolver); 
      XPathNavigator summaryNavigator  = dataNavigator.SelectSingleNode("itunes:summary", resolver); 
      XPathNavigator durationNavigator = dataNavigator.SelectSingleNode("itunes:duration", resolver); 

      string author = authorNavigator != null ? authorNavigator.Value : String.Empty; 
      string subtitle = subtitleNavigator != null ? subtitleNavigator.Value : String.Empty; 
      string summary = summaryNavigator != null ? summaryNavigator.Value : String.Empty; 
      string duration = durationNavigator != null ? durationNavigator.Value : String.Empty; 

      // Get attributes of <enclosure> element 
      foreach (SyndicationLink enclosure in item.Links.Where<SyndicationLink>(x => x.RelationshipType == "enclosure")) 
      { 
       Uri url    = enclosure.Uri; 
       long length   = enclosure.Length; 
       string mediaType = enclosure.MediaType; 
      } 
     } 
    } 
} 
+0

इससे मुझे बहुत मदद मिली! यदि आप <मीडिया: थंबनेल /> यूआरएल विशेषता प्राप्त करना चाहते हैं तो XPathNavigator.GetAttribute ("url", ""); – walteronassis

15

यहाँ कैसे मैं एक फ़ीड SyndicationFeed का उपयोग करने से अटैचमेंट लिंक को पुन: प्राप्त करने में कामयाब रहे है।

static void Main(string[] args) 
{ 
    var feedUrl = "http://blog.stackoverflow.com/index.php?feed=podcast"; 

    using (var feedReader = XmlReader.Create(feedUrl)) 
    { 
     var feedContent = SyndicationFeed.Load(feedReader); 

     if (null == feedContent) return; 

     foreach (var item in feedContent.Items) 
     { 
      Debug.WriteLine("Item Title: " + item.Title.Text); 

      Debug.WriteLine("Item Links"); 
      foreach (var link in item.Links) 
      { 
       Debug.WriteLine("Link Title: " + link.Title); 
       Debug.WriteLine("URI: " + link.Uri); 
       Debug.WriteLine("RelationshipType: " + link.RelationshipType); 
       Debug.WriteLine("MediaType: " + link.MediaType); 
       Debug.WriteLine("Length: " + link.Length); 
      } 
     } 
    } 
} 

उत्पादन इस प्रकार है:

मद शीर्षक: पॉडकास्ट # 50
आइटम लिंक
लिंक शीर्षक:
यूआरआई: http://blog.stackoverflow.com/2009/04/podcast-50/
RelationshipType: वैकल्पिक
MediaType:
लंबाई: 0
लिंक शीर्षक:
यूआरआई: http://itc.conversationsnetwork.org/audio/download/ITC.SO-Episode50-2009.04.21.mp3
RelationshipType: बाड़े
MediaType: ऑडियो/एमपीईजी
की लंबाई: 36580016

आप अपने रिश्ते प्रकार से अटैचमेंट लिंक की पहचान कर सकते हैं।

using System.Linq; 
using System.ServiceModel.Syndication; 
using System.Xml; 
using System.Xml.Linq; 

SyndicationFeed feed = reader.Read(); 

foreach (var item in feed.Items) 
{ 
    foreach (SyndicationElementExtension extension in item.ElementExtensions) 
    { 
     XElement ele = extension.GetObject<XElement>(); 
     Console.WriteLine(ele.Value); 
    } 
} 
35

यह आप इसे कैसे करना है पर एक विचार देना चाहिए

private static T GetExtensionElementValue<T>(SyndicationItem item, string extensionElementName) 
{ 
     return item.ElementExtensions.First(ee => ee.OuterName == extensionElementName).GetObject<T>(); 
} 

कि क्या तत्व होने की गारंटी कर रहे हैं पर या कि क्या आप पु कर रहे हैं निर्भर करता है: जैसा कोई सामान्य सहायक समारोह उपयोग करने पर विचार इसे एक पुन: प्रयोज्य पुस्तकालय में डालकर, आपको अतिरिक्त रक्षात्मक प्रोग्रामिंग जोड़ने की आवश्यकता हो सकती है।

+0

मुझे इस सादगी के लिए यह जवाब पसंद है और क्योंकि यह ओपी द्वारा उपयोग की जाने वाली सिंडिकेशन फीड क्लास का उपयोग करता है। हालांकि, यह 'संलग्नक' संपत्ति वापस नहीं लौटाता है जिसे उन्हें उजागर करने की आवश्यकता है। क्या मैं कुछ भूल रहा हूँ? – Joshua

13

आप विस्तार तत्वों या XElement मदों की गैर एक्सएमएल सामग्री को पुन: प्राप्त कर रहे हैं, आप देख सकते हैं:

+3

यह सुनिश्चित नहीं है कि यह उच्चतर क्यों संशोधित नहीं है। एक अच्छा, साफ, एक लाइन समाधान। मेरे लिये कार्य करता है! – egandalf

+0

अब तक का सबसे अच्छा जवाब – Wingjam

संबंधित मुद्दे